Hibernate文档:父/子类型关系

时间:2014-11-06 07:28:33

标签: java hibernate jpa documentation

在Hibernate文档中,such有一句话:

  

Hibernate中一对多关联的默认语义是   更接近于父/子关系的通常语义   而不是复合元素映射的那些。

我觉得这句话很混乱,有人可以解释一下这意味着什么吗?此外,在Best Pratices页面上,您会找到

  

编写细粒度类并使用<component>

映射它们

我不知道该怎么做。使用Hibernate API而不是JPA时使用<component>进行映射?如果这是特定于Hibernate的,它如何转换为JPA?

1 个答案:

答案 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

我希望这会对你有所帮助。