Hibernate中@MapsId注释的目的

时间:2014-08-12 16:47:21

标签: java hibernate

我试图了解@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注释的概念。

1 个答案:

答案 0 :(得分:2)

@MapsId将共享主要实体的主键,因为子实体的主键不需要在子实体中插入外键。 Hibernate将映射实体的PK并返回一个对象。

相关问题