在Hibernate文档中,such有一句话:
Hibernate中一对多关联的默认语义是 更接近于父/子关系的通常语义 而不是复合元素映射的那些。
我觉得这句话很混乱,有人可以解释一下这意味着什么吗?此外,在Best Pratices页面上,您会找到
编写细粒度类并使用
映射它们<component>
我不知道该怎么做。使用Hibernate API而不是JPA时使用<component>
进行映射?如果这是特定于Hibernate的,它如何转换为JPA?
答案 0 :(得分:3)
案例1: Hibernate中一对多关联的默认语义远不如父/子关系的通常语义那么接近于复合元素映射的语义。 表示: -
假设您有两个名为A
&amp;的班级。 B
。 A有主键 aId
,它是B中的外键。然后在这种情况下,当你使用Hibernate映射它们时,可以调用 A作为B&amp; /或B的父母是A的孩子。因为B对于它的主键依赖于A.如果您尝试在B
之前在A
课程中添加条目,则会出现类似ConstraintViolationException
的错误。
案例2 :撰写细粒度类并使用 <component>
对其进行映射: -
Hibernate中的组件一词是指另一个对象中包含的对象&amp;不是数据库中的单独实体。 Word 组件描述了Hibernate中的组合。更准确地说,它意味着在Java中使用两个单独的对象在数据库表中创建一个实体。
例如:您有一个包含各种字段的Person
对象,id, firstName, lastName, address, age, etc.
然后您可以在数据库中创建单个表作为< / p>
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
&amp; 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
}
要在此方案中引入构图,您可以在 XML配置或 @Embedded&amp ;;的情况下使用 <component>
标记。 @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>
另一方面,使用 @Embedded&amp; POJO类中的@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类不能拥有自己的主键,它使用封闭的类主键。
在DB中保留人员 在数据库上执行插入操作时。您需要先创建一个Address class&amp;的对象。然后是人类。
Address address = new Address("ABC Road", "MH", "440022");
Person person = new Person("A", "Z", 10, address);
session.save(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 A 关系,其中一个实体是 另一个实体的一部分,如果包含的实体不存在没有容器实体。
更多解释: Association, Aggregation and Composition
我希望这会对你有所帮助。