Hibernate文档:父/子类型的关系

问题描述:

在Hibernate文档,有such一句:Hibernate文档:父/子类型的关系

一个一对多的关联在Hibernate中的默认语义 更接*时的语义的父母/子女关系 比那些复合元素映射。

我发现这句话很混乱,有人可以解释一下它的含义吗?此外,Best Pratices页面上,你会发现

写细粒度的类和使用<component>

我不知道怎么利用这些映射。当您使用Hibernate API而不是JPA时,是否使用<component>进行映射?如果这是Hibernate特有的,它如何转化为JPA?

+0

看看我的答案。我试图在你的问题中解释上述查询。我希望它能帮助你。 – OO7 2014-11-06 11:46:44

情况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

我希望这可以帮助你。

+0

非常感谢您的回答。在情况1中,您是否也可以将其与**复合元素映射进行对比** – Dkyc 2014-11-09 11:05:13

+1

@Dkyc我已经更新了我的答案,并在关联和合成方面有所不同。看看它。 – OO7 2014-11-10 13:44:49