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

时间:2013-01-09 05:54:19

标签: java hibernate jpa hibernate-annotations

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

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

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

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

所以,我有一个抽象类,注释了@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和名称getter但这意味着我必须在每个类中添加它们并且它不是一个好的设计:( 另外,以下insertable =“false,updateable = false可以帮助,但我不明白这是什么意思...

请帮助我!

4 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

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。超类及其子类之间没有重复的属性。所以它会正常工作。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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