2

我正在阅读休眠参考,它们是休眠中的两个元素:<join><any>. 看完后,不知道参考资料在说什么。

我不明白什么时候使用join/any,它们适合什么样的场景?<join/>:设置“fetch”时,hibernate什么时候用inner join,什么时候用outer join,什么时候用select?哪些表使用了哪些列?对于提供的示例休眠参考,它说: <join table="ADDRESS"> <key column="ADDRESS_ID"/> <property name="address"/> <property name="zip"/> <property name= "country"/> </join>,那么用哪一列来连接这两个表呢?

当为 <join> 设置 fetch 时,它说: fetch (optional - defaults to join): 如果设置为 join,默认情况下,Hibernate 将使用内部连接来检索由类定义的 <join>(我的问题:有人会请给我一个例子说:哪个是这个类?)或其超类((我的问题:有人可以给我一个例子说:哪个是这个类?))和一个由定义的 <join> 的外连接一个子类((我的问题:有人可以给我举个例子说:这是这个类吗?))。如果设置为选择,那么 Hibernate 将对子类上定义的 <join> 使用顺序选择((我的问题:有人可以给我举个例子说:这是这个类吗?)),只有在行原来代表子类的一个实例((我的问题:有人可以给我举个例子说:这门课是什么?))。内部连接仍将用于检索由类及其超类定义的((我的问题:有人可以给我举个例子说:这是哪个类?))。

换句话说,我想知道下面所说的所有类是什么: fetch (optional - defaults to join): 如果设置为 join,默认情况下,Hibernate 将使用内部连接来检索由类定义的 <join> 或它的超类和由子类定义的 <join> 的外连接。如果设置为选择,那么 Hibernate 将对子类上定义的 <join> 使用顺序选择,只有当一行结果代表子类的实例时才会发出。内部连接仍将用于检索由类及其超类定义的 <join>。

对于<any>,它适合什么样的场景?你能解释一下它是如何工作的吗?有没有人提供例子并向我解释?谢谢。

4

1 回答 1

0
  • <join>用于映射一类两个 2+ 表,这些表在主键/ID 上具有一对一关联

    Table A        Table B
    -------        -------
    id | name      a_id | status
    
    class Foo
    {
        private int id;
        private string name;
        private string status;
    }
    
    <class name="Foo">
      <id name="id"/>
      <property name="name"/>
      <join table="B">
        <key column="a_id"/>
        <property name="status"/>
      </join>
    </class>
    
  • <any>用于映射多态引用,例如联系人可以引用它所属的用户或公司。所以它使用两列:一列是公司/用户的 id,第二列存储引用的类型,例如“用户”或“公司”。优点是它知道被引用实体的类型(和表),而无需查看所有可能的表

    Table Users         Table Companies
    ----------          -------------
    id | name           id | trademark
    
    Table Contacts
    -----------------------
    id | text | owner_id | owner_type
    
    class User/Company implements HasContacts
    {
        private int id;
        private string name/trademark;
        private Set<Contact> contacts;
    }
    
    class Contact
    {
        private int id;
        private string text;
        private HasContacts owner;
    }
    
    <class name="Contact">
      <id name="id"/>
      <property name="name"/>
      <any name="owner" id-type="System.Int64" meta-type="System.String">
        <meta-value value="user" class="User"/>
        <meta-value value="company" class="Company"/>
        <column name="owner_id"/>
        <column name="owner_type"/>
      </any>
    </class>
    
    <class name="User">
      <id name="id"/>
      <property name="name"/>
      <set name="contacts" where="owner_type='user'">
        <key column="owner_id"/>
        <one-to-many class="Contact"/>
      </set>
    </class>
    
    <class name="Company">
      <id name="id"/>
      <property name="trademark"/>
      <set name="contacts" where="owner_type='company'">
        <key column="owner_id"/>
        <one-to-many class="Contact"/>
      </set>
    </class>
    
于 2012-11-07T07:49:09.227 回答