2016-05-11 60 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,只要确保每个事件只有一个详细信息行。否则,当你有多个细节时你会得到多行,或者当一个事件没有细节的时候你会删除行(因为内联接)。

相关问题