2012-10-09 147 views
0

我是新來的休眠我創建了表和映射,我使用下面的代碼列出我的表中的所有行。休眠查詢一對一的關係

List places = session.createQuery("FROM Place").list(); 
for (Iterator iterator = places.iterator(); iterator.hasNext();) { 
    Place place = (Place) iterator.next(); 
    System.out.println("-" + place.getName()); 
} 

此代碼工作正常但是,地方臺與地址表中的一比一的關係,而這種代碼返回空值在地址表中的所有行,並打印出:

-null 
-null 
-null 
-343 
-223 
-122 

我只想要來自PLACES表的行。我怎樣才能管理這個?

重要提示:在Pierre-Henri Toussaint的回答之後,我注意到了生成的sql。休眠首先從地方產生從地址選擇查詢,然後選擇查詢(當我約束值更改爲false它產生於各行的查詢地址表)

Address.hbm.xml:

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
    <class name="com.places.general.Address" table="ADDRESS" schema="dbo"> 
     <id name="placeId" type="java.lang.Integer"> 
      <column name="PLACE_ID" /> 
      <generator class="foreign"> 
       <param name="property">place</param> 
      </generator> 
     </id> 
     <one-to-one name="place" class="com.places.general.Place" 
        constrained="true"> 
     </one-to-one> 
     <property column="PLACE_ADDRESS" length="250" name="placeAddress" type="java.lang.String"/> 
     <property column="PHONE" length="50" name="phone" type="java.lang.String"/> 
    </class> 
</hibernate-mapping> 

Place.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
    <class name="com.places.general.Place" table="PLACES" schema="dbo"> 
     <id column="ID" name="id" type="java.lang.Integer"> 
      <generator class="identity"/> 
     </id>   
     <property column="NAME" length="100" name="name" not-null="true" type="java.lang.String"/> 
     <property column="DETAILS" length="200" name="details" type="java.lang.String"/> 
    </class> 
</hibernate-mapping> 

Place.java:

import java.io.Serializable; 

public class Place implements Serializable{ 
    private Integer id; 
    private String name; 
    private String details; 

    public Place() { 
    } 

    public Place(String name, String details) { 
     this.name = name; 
     this. details = details; 
    } 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getDetails() { 
     return details; 
    } 

    public void setDetails(String details) { 
     this. details = details; 
    } 
} 
+0

你可以發佈你的實體和place.hbm.xml文件嗎? – mstzn

+0

我更新了我的帖子 – irmu

回答

0

我想清楚是什麼導致了這個問題。所有的答案真的幫助我。

試圖學習與我的面向對象和SQL知識的休眠,我想我使用了休眠錯誤。當我第一次創建結構時,我從Place類擴展了Address類。在添加一對一關係之後,我仍然從Place類繼承,現在我刪除了繼承,代碼按照我希望的方式工作。

感謝您的所有答案!

+3

有點不冷酷,說所有的答案都有幫助,然後接受你自己的答案,這並沒有給出任何關於什麼的信息問題是或如何解決它。 – glasspill

1

不知道constrained關鍵字,但似乎執行了右外連接查詢。

我會建議通過啓用SQL輸出與調查查詢:

<property name="show_sql">true</property> 

從這裏就可以解決特定的問題。

+0

有趣的是,list()函數首先生成一個地址選擇查詢,然後選擇查詢地點 – irmu

3

Make constrained = false。

這是什麼意思: Constrained = true表示地址不能存在沒有地址。如果您想通過提供place_id來獲得地點,則應該存在第一個地址對象。順便做這將是,

Address address = (Address) session.load(Address.class, address_id); 
    Place place = address.getPlace(); 

如果進行限制= false,那麼可以,

Place place = (Place) session.load(Place.class, place_id); 

同樣適用於的createQuery。

注意,如果你使用Hibernate3中,約束=真應該在工作以及..它不hibernate4工作..

-Maddy

+0

我使用hibernate3,更改約束沒有工作,不幸的是 – irmu

1

您的位置實體沒有地址的實體如果你想正確地建立一對一的關係,請檢查一下。

Hibernate – One-To-One Example (XML Mapping)

+0

我已經修復了它,謝謝指出出來,但是我仍然得到地址表中的行的空值。 – irmu

+0

如果您的數據庫在地址表中有空值,則應刪除這些空值。注意:你應該在Address.hbm.xml文件中使用constrained =「true」,它確保地方必須存在 – mstzn

2

看起來像你的映射需要一些變化

在address.hbm.xml

<one-to-one name="place" class="com.places.general.Place" lazy="false" cascade="all"/> 

在你place.hbm。xml

<one-to-one name="address" class="com.places.general.Address" constrained="false"/>