何时在hibernate中使用property-ref属性

时间:2016-06-26 14:13:18

标签: hibernate

我已经完成了示例程序。我使用了property-ref属性。即使我不使用它仍然有效。请告诉我这个程序中property-ref属性的实际用法是什么。

 <hibernate-mapping package="com.hibernate.onetone">
 <class name="Book" table="BOOK">
    <id name="id" column="BOOK_ID">
        <generator class="native" />
    </id>
    <property name="title" type="string" column="TITLE" />
    <property name="description" type="string" column="DESCRIPTION" />
    <property name="publishedDate" type="date" column="PUBLISHED" />

    <many-to-one name="author" class="com.hibernate.onetone.Author"
        column="author_id" unique="true" not-null="true"
        cascade="all" />             
   </class>
  </hibernate-mapping>

  <hibernate-mapping package="com.hibernate.onetone">
  <class name="Author" table="AUTHOR">
    <id name="id" column="AUTHOR_ID">
        <generator class="native"/>
    </id>
    <property name="name" column="NAME" />
    <property name="email" column="EMAIL" />  

   <!--  <property name="serialNumber" column="SerialNumber" /> -->
    <one-to-one name="book" class="Book" property-ref="author"
   constrained="true" cascade="all"/>    
   </class> 
  </hibernate-mapping>

   public class Book {
   private long id;
   private String title;
   private String description;
   private Date publishedDate;
   private Author author;       
   }
  public class Author {
  private long id;
  private String name;
  private String email;
  private Book book;     {
  }

3 个答案:

答案 0 :(得分:3)

property-ref属性用于使关联成为双向关联,并指定关联的哪一侧是关系的所有者。 在生成的查询中,只有当关系的所有者更新而不是另一方时,才会导致外键更新。

与文档一样

  

property-ref(可选):连接到此外键的关联类的属性的名称。如果未指定,则使用关联类的主键。

请查看以下链接以获取更多信息

http://www.allappforum.com/hibernate/hibernate_o_r_mapping_one_to_one_element.htm

http://www.allappforum.com/hibernate/hibernate_o_r_mapping_many_to_one_element.htm

如果您还可以提供映射和执行代码以便我可以更清楚地解释,那将会很棒:)

答案 1 :(得分:1)

property-ref用于标记关系的所有者。

您在此处创建了Book和Author之间的双向关联。这意味着当您拥有Book实例时,您可以使用getAuthor()来检索该书的Author实例。同样,您在Author类中也有一个Book实例,以便您可以导航回Book实例。

在Book实体映射中,您可以指定作者的外键,如下所示

<many-to-one name="author" class="com.hibernate.onetone.Author"
    column="author_id" unique="true" not-null="true"
    cascade="all" />  

但是从Author类中你需要在关系的另一端指定应该与Author的主键连接的外键。你能怎么做?您使用property-ref属性。

现在,如果您不在一对一映射中使用property-ref属性,Hibernate将尝试使用Book类的主键加入Author类的主键,以便解决关联。

下面是hibernate使用get()

通过标识符获取Author的查询

使用property-ref

select
    author0_.AUTHOR_ID as AUTHOR_I1_0_0_,
    author0_.NAME as NAME2_0_0_,
    author0_.EMAIL as EMAIL3_0_0_,
    book1_.BOOK_ID as BOOK_ID1_1_1_,
    book1_.TITLE as TITLE2_1_1_,
    book1_.DESCRIPTION as DESCRIPT3_1_1_,
    book1_.PUBLISHED as PUBLISHE4_1_1_,
    book1_.author_id as author_i5_1_1_ 
from
    AUTHOR author0_ 
left outer join
    BOOK book1_ 
        on author0_.AUTHOR_ID=book1_.author_id 
where
    author0_.AUTHOR_ID=?

没有property-ref

select
    author0_.AUTHOR_ID as AUTHOR_I1_0_0_,
    author0_.NAME as NAME2_0_0_,
    author0_.EMAIL as EMAIL3_0_0_,
    book1_.BOOK_ID as BOOK_ID1_1_1_,
    book1_.TITLE as TITLE2_1_1_,
    book1_.DESCRIPTION as DESCRIPT3_1_1_,
    book1_.PUBLISHED as PUBLISHE4_1_1_,
    book1_.author_id as author_i5_1_1_ 
from
    AUTHOR author0_ 
left outer join
    BOOK book1_ 
        on author0_.AUTHOR_ID=book1_.BOOK_ID 
where
    author0_.AUTHOR_ID=?

注意连接条件的差异

使用属性引用加入book的author_id和Author的author_id,如下所示

on author0_.AUTHOR_ID = book1_.author_id

没有属性ref,连接在作者的author_id和book的book_id上,如下所示

on author0_.AUTHOR_ID = book1_.BOOK_ID

这与文档中所说的内容一致

  

property-ref(可选):连接到此外键的关联类的属性的名称。如果未指定,则使用关联类的主键。

因此,当您提供属性ref时,它将与属性ref

中指定的Book的外键连接
  <one-to-one name="book" class="Book" property-ref="author" cascade="all"/>

当你没有提供属性ref时,它会加入Book

的主键
  <one-to-one name="book" class="Book" cascade="all"/>

答案 2 :(得分:0)

property-ref (可选):连接到此外键的关联类的属性名称。如果未指定,则使用关联类的主键。

property-ref属性仅应用于映射遗留数据,其中外键引用除主键之外的关联表的唯一键。这是一个复杂而混乱的关系模型。例如,如果Product类具有不是主键的唯一序列号。 unique属性使用SchemaExport工具控制Hibernate的DDL生成。

<property name="serialNumber" unique="true" type="string" column="SERIAL_NUMBER"/>

然后OrderItem的映射可能会使用:

<many-to-one name="product" property-ref="serialNumber" column="PRODUCT_SERIAL_NUMBER"/>

但不鼓励这样做。

如果引用的唯一键包含关联实体的多个属性,则应将引用的属性映射到命名元素中。

如果引用的唯一键是组件的属性,则可以指定属性路径:

<many-to-one name="owner" property-ref="identity.ssn" column="OWNER_SSN"/>

了解更多信息:mapping-declaration-properties