复合键,其中键的一部分来自超类

时间:2013-10-23 14:26:02

标签: java hibernate polymorphism

我在表格上有一些对象。

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创建复合键 - 但是当其中一个关键部分实际来自超类时,我无法看到如何做到这一点。

2 个答案:

答案 0 :(得分:1)

我建议您为myMember in AbstractSomething`

声明抽象getter和setter
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;
}

这有点笨重,但我相信它应该有效。