首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Hibernate查询一对一关系

Hibernate查询一对一关系
EN

Stack Overflow用户
提问于 2012-10-09 16:12:41
回答 4查看 8.1K关注 0票数 0

我是hibernate的新手,我创建了表和映射,并使用以下代码列出了表中的所有行。

代码语言:javascript
运行
复制
List places = session.createQuery("FROM Place").list();
for (Iterator iterator = places.iterator(); iterator.hasNext();) {
   Place place = (Place) iterator.next();
   System.out.println("-" + place.getName());
}

但是,此代码运行良好,PLACE表与ADDRESS表具有一对一的关系,并且此代码为ADDRESS表中的所有行返回空值并打印输出:

代码语言:javascript
运行
复制
-null
-null
-null
-343
-223
-122

我只需要PLACES表中的行。我该如何管理它呢?

重要提示:在Pierre-Henri Toussaint的回答之后,我注意到生成的sql。

Address.hbm.xml:

代码语言:javascript
运行
复制
<!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:

代码语言:javascript
运行
复制
<?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:

代码语言:javascript
运行
复制
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;
    }
}
EN

回答 4

Stack Overflow用户

发布于 2012-10-09 18:30:17

生成constrained=false。

意思是: Constrained=true意味着一个地方没有地址就不能存在。如果你想通过提供place_id来获得一个位置,第一个Address对象应该存在。要做到这点,

代码语言:javascript
运行
复制
    Address address = (Address) session.load(Address.class, address_id);
    Place place = address.getPlace();

如果你做了constrained=false,你就能做到

代码语言:javascript
运行
复制
   Place place = (Place) session.load(Place.class, place_id);

这同样适用于createQuery。

请注意,如果您使用的是hibernate3,那么constrained=true也应该可以正常工作。它在hibernate4上不起作用。

-Maddy

票数 3
EN

Stack Overflow用户

发布于 2012-10-09 21:01:43

看起来您的地图需要进行一些更改

在address.hbm.xml中

代码语言:javascript
运行
复制
<one-to-one name="place" class="com.places.general.Place" lazy="false" cascade="all"/>

在你的place.hbm.xml中

代码语言:javascript
运行
复制
<one-to-one name="address" class="com.places.general.Address" constrained="false"/>
票数 2
EN

Stack Overflow用户

发布于 2012-10-09 17:54:40

我不知道constrained关键字,但似乎执行了一个正确的外部联接查询。

我建议通过使用以下命令启用sql输出来研究查询:

代码语言:javascript
运行
复制
<property name="show_sql">true</property>

从这里你可以解决具体的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12795641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档