当前位置: 首页 > 知识库问答 >
问题:

Hibernate注释-@Mep dSuperclass如何覆盖列标识符

吕衡
2023-03-14

我正在使用Hibernate注释,我试图解决的问题如下:

我需要有2个不同的@Entity类具有相同的列映射,但具有不同的标识符。

第一个应该使用id作为标识符。

第二个应使用名称作为标识符。

因此,我有一个抽象类,用@MappedSuperclass进行注释,这些@MappedSuperclass具有包括id和name在内的所有列,此外还有2个@Entity类,这些类扩展了超类并覆盖了id和name的getters。

@MappedSuperclass 
public class MappingBase {
    protected Integer id;
    protected String name;

    @Column (name = "ID")
     public void getId() {
          return this.id;
     }

    @Column (name = "NAME")
     public void getName() {
          return this.name;
     }              
}

@Entity
@Table (name = "TABLE")
public class Entity1 extends MappingBase {

  @Id
  @Column (name = "ID")
  public void getId() {
    return this.id;
  } 
}

@Entity
@Table (name = "TABLE")
public class Entity2 extends MappingBase {

  @Id
  @Column (name = "NAME")
  public void getName() {
      return this.name;
  } 
}

注意:我必须在超类中包含成员(id,name)。我知道我可以将@Transient添加到id和name getter中,但这意味着我必须在每个类中都添加它们,这不是一个好的设计:(此外,以下insertable=“false,updateable=“false”可能会有所帮助,但我不明白这是什么意思。。。

请帮帮我!

共有3个答案

缪坚诚
2023-03-14

试试这个样品,

Hibernate–@MappedSuperclass如何重写列标识符

莫誉
2023-03-14

最好将基类定义为@Embeddable并在实现类中使用@Embedded并使用@AttributeOverride。

张亦
2023-03-14

Hibernate/JPA允许我们注释属性或访问器。如果属性上有@Id注释,JPA将查找该类的所有属性。类似地,如果我们在getter方法上有@id注释,JPA将查找所有getter。

我们可以通过注释属性来解决上述问题。超类和两个子类如下:-

@MappedSuperclass
public abstract class AbstractMappingBase {

    //properties other than id and name

    public abstract Integer getId();

    public abstract String getName();

    //other getters and setters

}

@Entity
public class Entity1 extends AbstractMappingBase {

    @Id
    private Integer id;

    private String name;

    @Override
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Override
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

@Entity
public class Entity2 extends AbstractMappingBase {

    private Integer id;

    @Id
    private String name;

    @Override
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Override
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

这里JPA将寻找属性而不是getter。超类和它的子类之间没有重复的属性。所以它会很好地工作。

 类似资料:
  • 问题内容: 我正在考虑使用注释来定义我的Hibernate映射,但是遇到了一个问题:我想使用基础实体类来定义公共字段(包括ID字段),但是我希望不同的表具有不同的ID生成策略: 有什么办法可以做到这一点?我曾尝试将以下内容包含进来,但hibernate状态是我两次反对同一栏,这似乎是错误的: 问题答案: 在上面的代码中,您似乎在混合字段(超类)和方法(子类)的注释。Hibernate 参考文档建议

  • 我们正在使用Hibernate生成销售报告。 脚本 当用户在输入一些条件后点击生成报告按钮时,我正在使用Hibernate状态从数据库中获取数据,然后我们正在进行一些数据操作以生成实际的报告数据。报告数据存储在ArrayList中,然后保存到与Hibernate实体映射的数据库中,如下图所示 CommusionSummary。JAVA 每个月都会生成报告。我的问题是:2012年7月5日,用户已经生

  • 问题内容: 在Hibernate中如何注释Blob列?到目前为止,我有一堂课,有: 问题答案: @Lob应该可以解决blob和clob(使用String作为类型)

  • 我试图将某些方法排除在单元测试覆盖范围之外。我之所以使用Cobertura,是因为我发现从2.0版开始,他们引入了一个用于排除方法和类的覆盖忽略注释:https://github.com/Cobertura/Cobertura/wiki/covered-annotations

  • 我正在使用来衡量我的测试的代码覆盖率。我已经启用了分支机构覆盖,但我不能完全理解该报告。 没有分支保险,我得到100%的保险: 启用分支覆盖: 有问题的来源可以在这里找到。 <代码>21- 然而,<代码>53-