在 Hibernate 文档中,有 such一句话:
The default semantics of a one-to-many association in Hibernate are much less close to the usual semantics of a parent/child relationship than those of a composite element mapping.
我觉得这句话很困惑,谁能解释一下它的意思吗?另外,关于Best Pratices页面,你会发现
Write fine-grained classes and map them using
<component>
我不知道该怎么做这些。正在使用 <component>
进行映射当你使用 Hibernate API 而不是 JPA 时?如果这是 Hibernate 特定的,它如何转换为 JPA?
最佳答案
情况 1: Hibernate 中一对多关联的默认语义与复合元素映射的语义相比,不太接近父/子关系的通常语义. 表示 :-
假设您有两个名为 A
的类& B
。 A 有主键 aId
,这是 B 中的外键。那么在这种情况下,当您使用 Hibernate 映射它们时,A 可以被称为 B 的父级和/或 B 是 A 的子级。 因为,B 依赖于 A 的主键。如果您尝试在B
中添加条目课前A
然后它给出类似 ConstraintViolationException
的错误.
情况 2: 编写细粒度的类并使用 <component>
映射它们:-
Hibernate 中的“组件”一词指的是另一个对象中包含的对象,而不是数据库中的单独实体。单词组件描述了Hibernate中的组合。更准确地说,它意味着在 Java 中使用两个单独的对象在数据库表中创建一个实体。
例如:您有 Person
包含各种字段的对象,即 id, firstName, lastName, address, age, etc.
然后您可以在数据库中创建一个单个表作为
drop table if exists Person
create table Person(
id int,
firstName varchar(50),
lastName varchar(50),
street varchar(50),
state varchar(50),
zipcode int(8),
age int(3)
);
现在,您需要创建两个 pojo 类,即 Person
& Address
.
public class Person {
private int id;
private String firstName;
private String lastName;
private int age;
private Address address;
//getter/setter
}
public class Address {
private String street;
private String state;
private int zipCode;
//getter/setter
}
要在这种情况下引入组合,您可以使用 <component>
标签(如果是 XML 配置 或 @Embedded 和 @Embeddable 注释)。
如果您为 Person 类创建 XML 文件,则可能如下所示:
<hibernate-mapping>
<class name="Person" table="Person">
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<component name="address" class="Address">
<property name="street" column="street" type="String"/>
<property name="state" column="state" type="String"/>
<property name="zipcode" column="zipcode" type="int"/>
</component>
<property name="firstName" column="firstName" type="String"/>
<property name="lastName" column="lastName" type="String"/>
<property name="age" column="age" type="int"/>
</class>
</hibernate-mapping>
另一方面,在 POJO 类中使用 @Embedded 和 @Embeddable 注释:-
public class Person {
@Id
@GeneratedValue
private int id;
private String firstName;
private String lastName;
private int age;
@Embedded
private Address address;
//getter/setter
}
@Embeddable
public class Address {
private String street;
private String state;
private int zipCode;
//getter/setter
}
@Embedded注解用于指定; Address 实体应作为组件存储在 Person 表中。
@Embeddable注解用于指定; Address 类将用作组件。 Address 类不能有自己的主键,它使用封闭类的主键。
数据库中持久存在的人: 对数据库执行插入操作时。您需要首先创建 Address 类的对象,然后创建 Person 类的对象。
Address address = new Address("ABC Road", "MH", "440022");
Person person = new Person("A", "Z", 10, address);
session.save(person);
要检查 Person 表中的数据,您可以触发以下查询:-
mysql> select id, firstName, lastName, street, state from Person;
---------------------------------------------------
| id | firstName | lastName | street | state |
---------------------------------------------------
| 1 | A | Z | ABC Road | MH |
| 2 | B | Y | XYZ Road | MP |
---------------------------------------------------
2 rows in set (0.00 sec)
mysql>
<小时/>
编辑:案例 1 与案例 2(关联与组合):
案例 1 代表关联,而案例 2 代表组合。 关联旨在表示两个不同实体之间的关系,例如一对一、一对多、多对一、多对多。另一方面,组合通常被称为两个实体之间的HAS关系,其中一个实体是另一个实体的一部分,如果所包含的实体不能存在不存在容器实体。
更多说明: Association, Aggregation and Composition
希望这对您有帮助。
关于java - hibernate 文档: Parent/Child type relationship,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26773939/