我正在使用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可以帮助,但我不明白这是什么意思...
请帮助我!
答案 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定义。它应该工作!