我试图了解@MapsId注释在Hibernate中的区别。我已经阅读了Hibernate文档,但是由于我是Hibernate的新手,所以我仍然对那里给出的解释感到困惑。
document说:
@Entity
class Customer {
@EmbeddedId CustomerId id;
boolean preferredCustomer;
@MapsId("userId")
@JoinColumns({
@JoinColumn(name="userfirstname_fk", referencedColumnName="firstName"),
@JoinColumn(name="userlastname_fk", referencedColumnName="lastName")
})
@OneToOne User user;
}
@Embeddable
class CustomerId implements Serializable {
UserId userId;
String customerNumber;
//implements equals and hashCode
}
@Entity
class User {
@EmbeddedId UserId id;
Integer age;
}
@Embeddable
class UserId implements Serializable {
String firstName;
String lastName;
//implements equals and hashCode
}
在嵌入式id对象中,关联表示为
关联实体的标识符。但是您可以将其值链接到
通过@MapsId注释在实体中进行常规关联。的
@MapsId值对应于嵌入式ID的属性名称
包含关联实体标识符的对象。在数据库中
这意味着Customer.user和CustomerId.userId属性
共享相同的基础列(在这种情况下为user_fk)。
我不清楚这个解释是什么意思,所以我对配置文件中设置为
hbm2ddl
的create
感到厌倦,并观察到了这些:在Customer实体上使用@MapsId和@JoinColumns时,DDL语句为:
Hibernate: create table CUSTOMER (customerNumber varchar2(255 char) not null, preferredCustomer number(1,0) not null, userfirstname_fk varchar2(255 char) not null, userlastname_fk varchar2(255 char) not null, primary key (customerNumber, userfirstname_fk, userlastname_fk))
Hibernate: create table USER (firstName varchar2(255 char) not null, lastName varchar2(255 char) not null, age number(10,0), primary key (firstName, lastName))
Hibernate: alter table CUSTOMER add constraint UK_xxxx unique (userfirstname_fk, userlastname_fk)
Hibernate: alter table CUSTOMER add constraint FK_xxxx foreign key (userfirstname_fk, userlastname_fk) references TBL_USER
如果删除@MapsId和@JoinColumns批注,则会看到以下内容:
Hibernate: create table CUSTOMER (customerNumber varchar2(255 char) not null, firstName varchar2(255 char), lastName varchar2(255 char), preferredCustomer number(1,0) not null, user_firstName varchar2(255 char), user_lastName varchar2(255 char), primary key (customerNumber, firstName, lastName))
Hibernate: create table USER (firstName varchar2(255 char) not null, lastName varchar2(255 char) not null, age number(10,0), primary key (firstName, lastName))
Hibernate: alter table CUSTOMER add constraint FK_xxxx foreign key (user_firstName, user_lastName) references TBL_USER
请帮助我理解Hibernate中@MapsId批注的概念。
最佳答案
@MapsId将共享主实体的主键作为子实体的主键,而无需在子实体中插入外键。 Hibernate将映射两个实体的PK并返回一个对象。
关于java - Hibernate中@MapsId注释的目的,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25269763/