Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在hibernate中何时使用属性ref属性_Hibernate - Fatal编程技术网

在hibernate中何时使用属性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" />

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

公共课堂用书{
私人长id;
私有字符串标题;
私有字符串描述;
私人日期发布日期;
私人作者;
}
公共类作者{
私人长id;
私有字符串名称;
私人字符串电子邮件;
私人书籍{
}

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

如文件所示

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

请查看下面的链接以了解更多信息


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

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

property ref属性只能用于映射旧式数据,其中外键指的是关联表的唯一键,而不是主键。这是一个复杂且令人困惑的关系模型。例如,如果产品类具有唯一的序列号,而不是主键。唯一属性控制Hibernate使用SchemaExport工具生成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"/>


有关详细信息:

属性引用用于标记关系的所有者

在这里,您已经在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用于标记关系的所有者。