Hibernate文档:父/子类型的关系
在Hibernate文档,有such一句:Hibernate文档:父/子类型的关系
一个一对多的关联在Hibernate中的默认语义 更接*时的语义的父母/子女关系 比那些复合元素映射。
我发现这句话很混乱,有人可以解释一下它的含义吗?此外,Best Pratices页面上,你会发现
写细粒度的类和使用
<component>
我不知道怎么利用这些映射。当您使用Hibernate API而不是JPA时,是否使用<component>
进行映射?如果这是Hibernate特有的,它如何转化为JPA?
情况1:一一对多关联在休眠的默认语义的比的复合元件映射的父/子关系的通常语义少得多紧密。意味着: -
假设你有一个名为两类,A
& B
。 A有主键aId
,这是B. 外键那么在这种情况下,当你使用Hibernate映射它们,A可以被称为为B &的父/或B是A因为孩子,B依赖于A的主键。如果您尝试在A
之前的B
类中添加条目,则会出现类似ConstraintViolationException
的错误。
情况2:收件细粒度类和使用<component>
映射它们: -
字在休眠成分是指包含的对象在另一个对象&不作为一个单独的数据库中的实体。 Word 组件在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)
);
现在,你需要创建2 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
}
要在这种情况下引进组成,你可以在XML配置或@Embedded & @Embeddable注解的情况下使用<component>
标签。
如果为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 annotation用于指定; Address类将被用作组件。 Address类不能拥有自己的主键,它使用封闭类主键。
持久性人在DB: 在对数据库执行插入操作时。你需要先创建一个地址类&然后Person类的对象。
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>
编辑:CASE 1对CASE 2(协会VS组成):
案例1代表协会,而案例2代表组成。 关联意味着代表两个不同的实体之间的关系,例如一对一,一对多,多对一,多对多的两个不同的实体,如。另一方面,组成通常被称为两个实体之间的关系,其中一个实体是另一个实体的的部分,如果包含的实体在存在容器实体的情况下不能存在,则为。
情况更多内容:Association, Aggregation and Composition
我希望这可以帮助你。
看看我的答案。我试图在你的问题中解释上述查询。我希望它能帮助你。 – OO7 2014-11-06 11:46:44