2016-05-11 83 views
0

我有兩個表,並希望用Hibernate將它們映射到一個對象。來自兩個表的一個對象

這兩個表的原因是過去,我不會改變前端,這樣的訪問數據。 我有表事件(Event_ID,預覽,img)和Event_Details(ID,Event_ID,內容)。

我用Java編寫一個類:

public class Event { 
    private int event_ID; 
    private String preview; 
    private String img; 
    private String content; 
    //Getter and Setter 
} 

和下面的XML映射文件:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated 16.03.2016 20:33:10 by Hibernate Tools 3.5.0.Final --> 
<hibernate-mapping> 
    <class name="de.data.events.Event" table="ev1_event"> 
     <id name="id" type="int"> 
     <column name="Event_ID" /> 
     <generator class="assigned" /> 
     </id> 
     <property name="preview" type="java.lang.String"> 
     <column name="ev1_preview" /> 
     </property> 
     <property name="img" type="java.lang.String"> 
     <column name="ev1_img" /> 
     </property> 
    </class> 
    <class name="de.data.events.Event" table="pb1_event"> 
    <id name="id" type="int"> 
     <column name="id" /> 
     <generator class="assigned" /> 
    </id> 
    //some properties 
</class> 

的一部分,在那裏我已經加入到表1表2缺失。但是我沒有找到解決我的問題的方法。

回答

0

首先,你會有你的Hibernate實體。您的是EventEventDetail,但爲了好玩,我們在本例中以PersonAddress爲例。這裏的關鍵是您需要您的表格之間的一對一或多對一的關係。否則,你的結果集會變得很奇怪(稍後更多)。

@Entity 
@Table(name = "PERSON") 
public class Person { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "PERSON_ID") 
    public Integer id; 

    @Column(name = "NAME") 
    public String name; 

    @Column(name = "HOME_ADDRESS_ID") 
    public Integer homeAddressId; 

    @Column(name = "TEMP_ADDRESS_ID") 
    public Integer tempAddressId; 

    // . . . other fields,getters,setters 

} 

@Entity 
@Table(name = "ADDRESS") 
public class Address { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "ADDRESS_ID") 
    public Integer id; 

    @Column(name = "STREET") 
    public String street; 

    @Column(name = "CITY") 
    public String city; 

    // . . . other fields,getters,setters 

} 

然後,你有你的目標FlatObject POJO與一個構造函數,將相應地構建它:

public class FlatObject { 

    public final String name; 
    public final String homeStreet; 
    public final String homeCity; 
    public final String tempStreet; 
    public final String tempCity; 

    public FlatEntity(String name, String homeStreet, String homeCity, String tempStreet, String tempCity) { 
     this.name = name; 
     this.homeStreet = homeStreet; 
     this.homeCity = homeCity; 
     this.tempStreet = tempStreet; 
     this.tempCity = tempCity; 
    } 

    // . . . other fields,getters 

} 

最後,你會利用這些對象與Hibernate的HQL SELECT,你加入PersonAddress和使用他們的領域,構建一個新的FlatEntity

SELECT new FlatEntity(p.name, ha.homeStreet, ha.homeCity, ta.tempStreet, ta.tempCity) 
FROM 
    Person p, Address ha, Address ta 
WHERE 
     p.homeAddressId = ha.id 
    and p.tempAddressId = ta.id 

正如你可以看到,HQL陳述將加入PersonAddress兩次:一次是家庭地址,一次是臨時地址。

同樣適用於你的情況。因此,就你而言,如果你加入Event e, EventDetail ed WHERE e.id = ed.eventId,只要確保每個事件只有一個詳細信息行。否則,當你有多個細節時你會得到多行,或者當一個事件沒有細節的時候你會刪除行(因爲內聯接)。

相關問題