- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
根据 Hibernate documentation , @MapsId
注解的解释如下:
In the embedded id object, the association is represented as the identifier of the associated entity. But you can link its value to a regular association in the entity via the @MapsId annotation. The @MapsId value correspond to the property name of the embedded id object containing the associated entity's identifier. In the database, it means that the Customer.user and the CustomerId.userId properties share the same underlying column (user_fk in this case).
@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
}
还说:
While not supported in JPA, Hibernate lets you place your association directly in the embedded id component (instead of having to use the @MapsId annotation).
@Entity
class Customer {
@EmbeddedId CustomerId id;
boolean preferredCustomer;
}
@Embeddable
class CustomerId implements Serializable {
@OneToOne
@JoinColumns({
@JoinColumn(name="userfirstname_fk", referencedColumnName="firstName"),
@JoinColumn(name="userlastname_fk", referencedColumnName="lastName")
})
User user;
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
}
我尝试使用 Hibernate 本身 (hbm2ddl.auto=create
) 生成表格,以了解如何使用 @MapsId
注释。以下是我的观察:
如果我的 Customer
和 User
实体声明如下:
@Entity
@Table(name="TBL_CUSTOMER")
public 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;
}
@Entity
@Table(name="TBL_USER")
class User {
@EmbeddedId UserId id;
Integer age;
}
然后 Hibernate 生成的 DDL 语句说:
Hibernate: create table TBL_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 TBL_USER (firstName varchar2(255 char) not null, lastName varchar2(255 char) not null, age number(10,0), primary key (firstName, lastName))
Hibernate: alter table TBL_CUSTOMER add constraint UK_chvh5mukc81xk9t6fis3skab unique (userfirstname_fk, userlastname_fk)
Hibernate: alter table TBL_CUSTOMER add constraint FK_chvh5mukc81xk9t6fis3skab foreign key (userfirstname_fk, userlastname_fk) references TBL_USER
现在,如果我将我的 Customer
实体更改为:
@Entity
@Table(name="TBL_CUSTOMER")
public class Customer {
@EmbeddedId CustomerId id;
boolean preferredCustomer;
@OneToOne User user;
}
那么DDL语句是:
Hibernate: create table TBL_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 TBL_USER (firstName varchar2(255 char) not null, lastName varchar2(255 char) not null, age number(10,0), primary key (firstName, lastName))
Hibernate: alter table TBL_CUSTOMER add constraint FK_et3bgekef237d4kov7b9oqt85 foreign key (user_firstName, user_lastName) references TBL_USER
在这种情况下,如果我删除 @MapsId
和 @JoinColumn
注释,我会看到 TBL_CUSTOMER
有 2 个额外的列(名字和姓氏)。在这种情况下也没有额外的 alter 命令。
我是 Hibernate 的新手,所以我发现很难理解 Hibernate 文档中给出的解释,@MapsId
的目的是什么,我们何时必须使用它以及它如何影响底层数据库架构。
我也看过这篇 SO 帖子 - can someone please explain me @MapsId in hibernate?但我无法获得有关此注释的明确信息。
最佳答案
@MapsId 用于告诉 hibernate(或任何 JPA 提供程序,实际上)使用与此实体具有一对一关系的另一个实体的相同 ID。
这将避免使用额外的列来存储两个实体之间的引用,同时能够拥有双向关系。
关于java - 理解 Hibernate 中的 @MapsId 注解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25236449/
所以,我有 A 类和 B 类。 他们使用以下配置共享主键: 在 A 类中,我小时候引用了 B 类 @OneToOne(fetch = FetchType.EAGER, cascade = Cascad
尽管遵循了网上的所有示例,但我还是无法让@MapsId 正常工作。 这是我的设置: pom.xml: org.hibernate hibernate-entitymanager
我正在努力将 Spring Boot 1.5.21 项目 (Java 8u221) 升级到 Spring Boot 2.1.9 (Java 11.0.2-open)。在这两种情况下,我们都使用带有 s
为了共享 1<>1 关系的主键,我尝试使用 JPA @MapsId 注释但我没有成功。 这是我的 sql 表生成: CREATE TABLE `myschema`.`table2` ( `id` IN
我的 @MapsId 注释和 @EmbeddedId 存在问题。在 Hibernate 中运行代码时,我得到: Caused by: org.hibernate.PropertyAccessExcep
我的实体 DirigeantsEntreprise 和 Fournisseur 之间有 @OneToOne 关系,如下所示: @Entity @Table(name = "dirigeants_ent
我想了解 @MapsId 注释在 Hibernate 中有什么不同。我已经阅读了 Hibernate 文档,但由于我是 Hibernate 的新手,我仍然对那里给出的解释感到困惑。 document是
我想使用 Hibernate 5.3.10 和 JPA 映射一个 @OneToOne 关联。 我知道当不使用字节码增强时,@OneToOne 关联的父端不能延迟加载。 在这种情况下,我只想映射客户端并
我在 spring boot 2.1.1.RELEASE 上工作,hibernate 5.3.7.FINAL 规则是,用户可以没有电话(phone 在 user 中可以为空)但是,电话不能没有用户(u
我阅读了一些有关如何使用 @MapsId 映射 @OneToOne 关系的最佳实践 Like this 我想知道,如果实体是“共享”的,它会起作用吗? 例如... Employee has Addre
我的实体是: @Entity public class ReportSnapshot extends LightEntity { @Id @GeneratedValue private l
根据 Hibernate documentation , @MapsId 注解的解释如下: In the embedded id object, the association is represen
在以下示例中(来自 Vlad Mihalcea's post on "The best way to map a @OneToOne relationship with JPA and Hiberna
我有两个实体: @Entity @Table(name = "child") public class MappedChild { @Id @Column(name = "parent
我有 2 个实体,比如 Car 和 Engine(只是示例名称,但逻辑是相同的)。 @Entity public class Car { @Id private Long id;
我有 2 个名为 Post 和 PostDetails 的实体类。两者都使用 MapsId 并共享主键以 OneToOne 关系进行映射,如下所示。 Post.java @Entity @Table(
在我看来,以下两种映射方式实际上没有区别。以下是基于 @MapsId javadoc 的示例: // parent entity has simple primary key @Entity publ
我正在尝试使用多个映射属性。但是当我尝试运行代码时,代码会生成异常,此示例基于 Pro JPA 2 第 10 章一书。有以下代码: DeptID.java public class DeptId im
我正在尝试对位于 Hbase 中的两个表进行映射连接。我的目的是在hashmap中保留小表的记录并与大表进行比较,一旦匹配,再次将记录写入hbase中的表中。我使用 Mapper 和 Reducer
以下代码存在于 PROD 中并且每天运行,我正在尝试对其进行优化。我看到设置 hive.auto.convert.join=FALSE;正在让它执行一个 Reduce side join,它运行 2.
我是一名优秀的程序员,十分优秀!