我试图了解 @MapsId 注释在 Hibernate 中有何不同。我已经阅读了 Hibernate 文档,但我仍然对其中给出的解释感到困惑,因为我是 Hibernate 的新手。
该文件是这样说的:
@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
}
Run Code Online (Sandbox Code Playgroud)
在嵌入的 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
Run Code Online (Sandbox Code Playgroud)
如果我删除 @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
Run Code Online (Sandbox Code Playgroud)
请帮助我理解 Hibernate 中 @MapsId 注释的概念。