【问题标题】:Mapping over several Tables映射多个表
【发布时间】:2012-07-31 13:05:00
【问题描述】:

我有 3 张桌子:

    TABLE BOOKING (
  BOOK_ID  
  PERSONAL_ID                             
  ORGINIZER                      
  TITLE
    PRIMARY KEY ( BOOK_ID )
    FOREIGN KEY ( PERSONAL_ID)
);

TABLE ROOM
(
  ID
  BOOK_ID
  FROM                  
  UNTIL                        
  QUANTITY                   
  PRIMARY KEY ( ID) 
  FOREIGN KEY ( BOOK_ID)
);

TABLE PERSONAL
    (
      ID
      PERSONAL_ID
      NAME
      SURNAME
      EMAIL         
      PRIMARY KEY ( ID) 
    );

我在桌子 ROOM 上映射如下:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">

<class name="Depp.Domain.Booking, Depp.Core" >
    <id name="ID" unsaved-value="0" column="ID">
        <generator class="native">
            <!--<param name="sequence">GLOBALSEQUENCE</param>-->
        </generator>
    </id>
    <property name="Title" ></property>
    <property name="TitleEnabled" type="yes_no">
        <column name="THEMA_ENABLED"/>
    </property>
    <property name="ORGANIZER" column="PERSONAL_ID" not-null="true" ></property>
    <bag name="ROOM" inverse="true" lazy="true" cascade="all-delete-orphan" >
        <key column="BOOK_ID"/>
        <one-to-many class="Depp.Domain.ROOM, Depp.Core"/>
    </bag>

</class>

我的问题是如何映射表PERSONAL?我的问题是PERSONAL没有外键,所以我不知道如何映射PERSONAL。我需要从该表中获取NAMESURNAMEEMAIL

希望有人可以帮助我

谢谢!

【问题讨论】:

    标签: hibernate nhibernate nhibernate-mapping hibernate-mapping


    【解决方案1】:

    Booking 和 Personal 之间的关联可以映射为 unidirectional many-to-one association

    使用property-ref属性指定要加入的个人主键以外的字段,在您的情况下,它是personalId属性对应于数据库列PERSONAL_ID而不是Personal类的ID。

    property-ref(可选)

    关联属性的名称 加入这个外键的类。如果未指定,则 使用关联类的主键。

    Hibernate - why use many-to-one to represent a one-to-one? 上查看这个 stackoverflow 问题

    映射

    <class name="Booking" >
        <id name="ID" unsaved-value="0" column="ID">
            <generator class="native">
                <!--<param name="sequence">GLOBALSEQUENCE</param>-->
            </generator>
        </id>
        ...
        <many-to-one name="personal" column="PERSONAL_ID"   property-ref="personalId" not-null="true"/>
        ...
    </class>
    
    <class name="Personal">
        <id name="id" column="ID">
            <generator class="native"/>
        </id>
        
        <property name="personalId" column="personal_id" />
        <property name="name" />
        <property name="surname" />
        <property name="email" />
        
    </class>
    

    Java

    public class Booking{
    
        private Long id;
    
        private Personal personal;
        ...
    }
    
    
    
    public class Personal 
    {
        Long id;
            
        private Long personalId;   
        private String name;        
        private String surname;
        private String email;
    }
    

    【讨论】:

    • 这对我不起作用。我试过了,但每次我建立多对一关系或个人课程时,我的网站都会崩溃。不知道为什么。
    • 使用 property-ref,因为您不想加入个人表的主键 ID,而是加入 PERSONAL_ID 列。我修改答案。
    【解决方案2】:

    如何使用 HQL 获取该表对象的列表?要获取映射对象,必须定义 FK 不是吗,否则 hibernate 将如何映射列?

    【讨论】:

    • BOOKING 是主表。我可以映射 ROOM,因为 ROOM 有一个 FK“BOOK_ID”。但我无法映射到 PERSONAL,因为该表没有 FK“BOOK_ID”。但是 BOOKING 表有一个 FK“PERSONAL_ID”。是否可以通过 BOOKING 表中的“PERSONAL_ID”从 PERSONAL 表中获取姓名、姓氏和电子邮件?
    • 但是personal_id在两个表中都有,你可以使用任何值不是吗?
    • 似乎我没有回答正确的问题:c 你到底想做什么?我的意思是,返回的结果?因为正如我回答的那样,您可以通过单独的 HQL 查询获取所有人的列表。
    • 我想在表格中显示返回值。你的意思是用单独的 HQL 查询一个新的文件,我可以用它映射到 PERSONAL?
    • 是的,类似的。因为当您想显示个人列表时,我认为不需要包括预订表。否则如何在映射中尝试双向关系?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2023-03-14
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    相关资源
    最近更新 更多