2

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

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

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

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

所以,我有一个抽象类,用 @MappedSuperclass 注释,其中包含所有列,包括 id 和 name,另外还有 2 个 @Entity 类,它们扩展了超类并覆盖了 id 和 name 的 getter。

@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 可以提供帮助但我不明白这是什么意思...

请帮我!

4

4 回答 4

2

试试这个样本,

Hibernate - @MappedSuperclass 如何覆盖列标识符

于 2013-01-09T11:20:40.377 回答
2

Hibernate/JPA 允许我们注释属性或访问器。如果我们@Id在属性上有注释,JPA 将查找该类的所有属性。同样,如果我们@id在 getter 方法上有注解,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。超类与其子类之间没有重复的属性。所以它会正常工作。

于 2016-01-12T06:58:26.140 回答
1

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

于 2013-01-09T07:26:44.653 回答
0

如果我没记错的话,我只是定义了 2 个 @Entity 类,它们具有从一个抽象 @MappedSuperclass 类继承的同一个表。超类包含 id 成员,每个实体类定义它自己的 @Id @Column 定义。它应该工作!

于 2015-11-26T10:37:56.423 回答