1

我在表格上有一些对象。

abstract class AbstractSomething{
    int myMember;
    // getters and setters
}


class ConcreteClass extends AbstractSomething{
    int someOtherMember;
    String name;
    // getters and setters
}

现在我想ConcreteClass在我的数据库中保留(在一个数据库表中),其中唯一键应该是 myMember 的组合并someOtherMember使用休眠注释。对于我所看到的,通常使用@Embeddedand创建复合键@EmbedderID- 但是当其中一个键部分实际上来自超类时,我看不到如何做到这一点。

4

2 回答 2

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;
}

这有点笨拙,但我相信它应该可以工作。

于 2013-10-23T16:02:19.333 回答
1

我建议您为 myMember inAbstractSomething声明抽象 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
}
于 2013-10-23T15:17:01.367 回答