我试图了解@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)。

我不清楚这个解释是什么意思,所以我对配置文件中设置为hbm2ddlcreate感到厌倦,并观察到了这些:

在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/

10-11 02:35