我在表格上有一些对象。
abstract class AbstractSomething{
int myMember;
// getters and setters
}
class ConcreteClass extends AbstractSomething{
int someOtherMember;
String name;
// getters and setters
}
现在我想在我的数据库中保留ConcreteClass
(在一个数据库表中),其中唯一键应该是myMember和someOtherMember
的组合,使用hibernate注释。
对于我所看到的,通常使用@Embedded
和@EmbedderID
创建复合键 - 但是当其中一个关键部分实际来自超类时,我无法看到如何做到这一点。
答案 0 :(得分:1)
我建议您为myMember in
AbstractSomething`
abstract class AbstractSomething{
abstract int getMyMember();
abstract void setMyMember(int i);
// getters and setters
}
然后宣布
@Embeddable class SomethingId {
String name;
int myMember;
}
你的具体课程:
class ConcreteClass extends AbstractSomething{
@EmbeddedId SomethingId somethingId ;
int someOtherMember;
@Override
public int getMyMember(){
return somethingId.myMember;
}
@Override
public void setMyMember(int i){
somethingId.myMember = i;
}
// getters and setters
}
答案 1 :(得分:1)
我认为您可以使用@IdClass
执行此操作。类似的东西:
@MappedSuperclass
abstract class AbstractSomething {
@Id
int myMember;
}
@Entity
@IdClass(ConcreteClass.Key.class)
class ConcreteClass extends AbstractSomething {
public static class Key {
int myMember;
int someOtherMember;
// constructor, equals, hashCode
}
@Id
int someOtherMember;
}
这有点笨重,但我相信它应该有效。