我已经完成了示例程序。我使用了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; {
}
答案 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"/>