在hibernate中何时使用属性ref属性
我已经完成了示例程序。我使用了属性ref属性。即使我不使用,它仍然在工作。请让我知道这个程序中property ref属性的实际用法在hibernate中何时使用属性ref属性,hibernate,Hibernate,我已经完成了示例程序。我使用了属性ref属性。即使我不使用,它仍然在工作。请让我知道这个程序中property ref属性的实际用法 <hibernate-mapping package="com.hibernate.onetone"> <class name="Book" table="BOOK"> <id name="id" column="BOOK_ID"> <generator class="native" />
<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; {
}
公共课堂用书{
私人长id;
私有字符串标题;
私有字符串描述;
私人日期发布日期;
私人作者;
}
公共类作者{
私人长id;
私有字符串名称;
私人字符串电子邮件;
私人书籍{
}
属性ref属性用于使关联具有双向性,并指定关联的哪一侧是关系的所有者。
在生成的查询中,仅当关系的所有者更新时,而不是在另一端更新时,才会导致外键更新
如文件所示
property ref(可选):与此外键联接的关联类的属性名称。如果未指定,则使用关联类的主键
请查看下面的链接以了解更多信息
如果您还可以提供映射和执行代码,以便我可以更清楚地解释:)
<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"/>
有关详细信息:属性引用用于标记关系的所有者 在这里,您已经在Book和Author之间创建了一个双向关联。这意味着当您有一个Book实例时,您可以使用getAuthor()检索该书的Author实例。同样,在Author类中也有一个Book实例,以便您可以导航回Book实例 在Book entity mapping中,指定作者的外键,如下所示
<many-to-one name="author" class="com.hibernate.onetone.Author"
column="author_id" unique="true" not-null="true"
cascade="all" />
无属性参考
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=?
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=?
请注意连接条件中的差异
使用属性ref,加入书的作者id和作者的作者id,如下所示
关于author0.AUTHOR\u ID=book1.AUTHOR\u ID
如果没有属性ref,则连接在author的author\u id和book的book\u id上,如下所示
关于author0.AUTHOR\u ID=book1.BOOK\u ID
这与下面的文档所说的是一致的
property ref(可选):与此外键联接的关联类的属性名称。如果未指定,则使用关联类的主键
因此,当您提供property ref时,它将与property 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"/>
正如我前面所说,property ref用于标记关系的所有者。