我有以下的现有DB模式,我想用Java和原生的JPA注解来重新创建(使用Hibernate作为供应商,所以冬眠具体说明会工作作为最后的手段),其中:JPA复合键@OneToMany
CREATE TABLE users (
user_id NUMBER NOT NULL -- pk
);
CREATE TABLE userdata_keys (
userdata_key_id NUMBER NOT NULL, -- pk
key VARCHAR2(128) NOT NULL
);
CREATE TABLE users_userdata (
user_id NUMBER NOT NULL, -- fk users.user_id
userdata_key_id NUMBER NOT NULL, -- fk userdata_keys.userdata_key_id
value VARCHAR2(256)
);
我由此产生了以下类和注解:
class User {
@Id
Long id;
@OneToMany
Set<Userdata> userdata;
}
class UserdataKey {
@Id
Long id;
String key;
}
class Userdata {
String value;
@EmbeddedId
UserdataId userdataId;
}
@Embeddable
class UserdataId {
User user;
UserdataKey userdataKey;
}
我离开了COLUMNNAME属性和这里的实体的其他属性。
然而,它并不像预期的那样工作。 如果我没有指定一个mappedBy属性为user.userdata,hibernate会自动创建一个表USERS_USERS_USERDATA,但据我所见不会使用它。但它确实使用我为用户数据类指定的表。
因为我对Java和hibernate还不太熟悉,所以我现在要做的测试是查看hibernate在持久化几个样本条目时创建的数据库模式。
因此,我完全不知道我是否正确地做到了这一点。我阅读了hibernate文档和相当多的Google结果,但他们都没有处理我想要做的事情(组合键与“子类”以及它们自己的主键)。
有一个类似的问题:http://stackoverflow.com/questions/31600142/how-to-define-onetomany-in-parent-entity-when-child-has-composite-pk – amphibient