我试图了解@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对象中,关联表示为 相关实体的标识符。但是你可以将它的值链接到a 通过@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注释的概念。
答案 0 :(得分:2)
@MapsId将共享主要实体的主键,因为子实体的主键不需要在子实体中插入外键。 Hibernate将映射实体的PK并返回一个对象。