首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

hibernate查询关联对象为空的有关问题

2012-12-17 
hibernate查询关联对象为空的问题是这样的 现在我有两张表 USERS 和IPMAC表IPMAC表中有个userid外键关联着

hibernate查询关联对象为空的问题
是这样的 现在我有两张表 USERS 和IPMAC表  IPMAC表中有个userid外键关联着USERS
做了相关映射后 
现在查 from ipmac 得出的结果 IPMAC表 一般信息 如IP可以查到,但是USERS对象查询结果为空
如果使用select i.users from Ipmac i 却可以查到users对象
在线求助各位大牛,附上配置文件等

Users.java


package cn.com.sedee.centermanager.hibernate;

import java.util.HashSet;
import java.util.Set;

/**
 * Users entity.
 * 
 * @author MyEclipse Persistence Tools
 */

public class Users implements java.io.Serializable {

// Fields

private Long id;
private String username;
private String password;
private String fullname;
private String remarks;
private Set roleses = new HashSet(0);
private Set rightses = new HashSet(0);
private Set bmdmbs = new HashSet(0);
private Set wflsbs = new HashSet(0);

// Constructors

/** default constructor */
public Users() {
}

/** full constructor */
public Users(String username, String password, String fullname,
String remarks, Set roleses, Set rightses, Set bmdmbs, Set wflsbs) {
this.username = username;
this.password = password;
this.fullname = fullname;
this.remarks = remarks;
this.roleses = roleses;
this.rightses = rightses;
this.bmdmbs = bmdmbs;
this.wflsbs = wflsbs;
}

// Property accessors

public Long getId() {
return this.id;
}

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

public String getUsername() {
return this.username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return this.password;
}

public void setPassword(String password) {
this.password = password;
}

public String getFullname() {
return this.fullname;
}

public void setFullname(String fullname) {
this.fullname = fullname;
}

public String getRemarks() {
return this.remarks;
}

public void setRemarks(String remarks) {
this.remarks = remarks;
}

public Set getRoleses() {
return this.roleses;
}

public void setRoleses(Set roleses) {
this.roleses = roleses;
}

public Set getRightses() {
return this.rightses;
}

public void setRightses(Set rightses) {
this.rightses = rightses;
}

public Set getBmdmbs() {
return this.bmdmbs;
}

public void setBmdmbs(Set bmdmbs) {
this.bmdmbs = bmdmbs;
}

public Set getWflsbs() {
return this.wflsbs;
}

public void setWflsbs(Set wflsbs) {
this.wflsbs = wflsbs;
}
@Override
public boolean equals(Object obj) {


// TODO Auto-generated method stub
if (((Users)obj).getId() == this.getId()) {
return true;
}
return false;

}

}


Ipmac.java

package cn.com.sedee.centermanager.hibernate; 

import java.math.BigDecimal;

/**
 * Ipmac entity. @author MyEclipse Persistence Tools
 */

public class Ipmac implements java.io.Serializable {

// Fields

private Long id;
private Users users;
private String ip;
private String mac;
private Long scbj;
private String byzd1;
private String byzd2;
private String bz;

// Constructors

/** default constructor */
public Ipmac() {
}

/** minimal constructor */
public Ipmac(Users users) {
this.users = users;
}

/** full constructor */
public Ipmac(Users users, String ip, String mac, Long scbj,
String byzd1, String byzd2, String bz) {
this.users = users;
this.ip = ip;
this.mac = mac;
this.scbj = scbj;
this.byzd1 = byzd1;
this.byzd2 = byzd2;
this.bz = bz;
}

// Property accessors

public Long getId() {
return this.id;
}

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

public Users getUsers() {
return this.users;
}

public void setUsers(Users users) {
this.users = users;
}

public String getIp() {
return this.ip;
}

public void setIp(String ip) {
this.ip = ip;
}

public String getMac() {
return this.mac;
}

public void setMac(String mac) {
this.mac = mac;
}

public Long getScbj() {
return this.scbj;
}

public void setScbj(Long scbj) {
this.scbj = scbj;
}

public String getByzd1() {
return this.byzd1;
}

public void setByzd1(String byzd1) {
this.byzd1 = byzd1;
}

public String getByzd2() {
return this.byzd2;
}

public void setByzd2(String byzd2) {
this.byzd2 = byzd2;
}

public String getBz() {
return this.bz;
}

public void setBz(String bz) {
this.bz = bz;
}

}

Users.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">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="cn.com.sedee.centermanager.hibernate.Users" table="USERS" schema="SEDMANAGER">
        <id name="id" type="java.lang.Long">


            <column name="ID" precision="22" scale="0" />
            <generator class="sequence">
            <param name="sequence">SQ_USERS</param>
            </generator>
        </id>
        <property name="username" type="java.lang.String">
            <column name="USERNAME" length="20" />
        </property>
        <property name="password" type="java.lang.String">
            <column name="PASSWORD" length="200" />
        </property>
        <property name="fullname" type="java.lang.String">
            <column name="FULLNAME" length="100" />
        </property>
        <property name="remarks" type="java.lang.String">
            <column name="REMARKS" />
        </property>
        <set name="roleses" table="USERS_ROLES" schema="SEDMANAGER" lazy="false">
            <key>
                <column name="USER_ID" precision="22" scale="0" not-null="true" />
            </key>
            <many-to-many entity-name="cn.com.sedee.centermanager.hibernate.Roles">
                <column name="ROLE_ID" precision="22" scale="0" not-null="true" />
            </many-to-many>
        </set>
        <set name="rightses" table="USERS_RIGHTS" schema="SEDMANAGER" lazy="false">
            <key>
                <column name="USER_ID" precision="22" scale="0" not-null="true" />
            </key>
            <many-to-many entity-name="cn.com.sedee.centermanager.hibernate.Rights">
                <column name="RIGHTS_ID" length="20" not-null="true" />
            </many-to-many>
        </set>
        <set name="bmdmbs" table="USERS_DEPARTMENTS" schema="SEDMANAGER">


            <key>
                <column name="USERS_ID" precision="22" scale="0" />
            </key>
            <many-to-many entity-name="cn.com.sedee.centermanager.hibernate.Bmdmb">
                <column name="BMDM_ID" precision="22" scale="0" />
            </many-to-many>
        </set>
        <set name="wflsbs" inverse="true">
            <key>
                <column name="CLR_ID" precision="22" scale="0" />
            </key>
            <one-to-many class="cn.com.sedee.centermanager.hibernate.Wflsb" />
        </set>
    </class>
</hibernate-mapping>


Ipmac.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">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="cn.com.sedee.centermanager.hibernate.Ipmac" table="IPMAC" schema="SEDMANAGER">
        <id name="id" type="java.lang.Long">
            <column name="ID" precision="22" scale="0" />
            <generator class="sequence" >
            <param name="sequence">SQ_IPMAC</param>
            </generator>
        </id>
        <many-to-one name="users" class="cn.com.sedee.centermanager.hibernate.Users" fetch="select">
            <column name="USERID" precision="22" scale="0" not-null="true" />
        </many-to-one>
        <property name="ip" type="java.lang.String">
            <column name="IP" length="20" />
        </property>
        <property name="mac" type="java.lang.String">
            <column name="MAC" length="40" />
        </property>
        <property name="scbj" type="java.lang.Long">


            <column name="SCBJ" precision="22" scale="0" />
        </property>
        <property name="byzd1" type="java.lang.String">
            <column name="BYZD1" length="50" />
        </property>
        <property name="byzd2" type="java.lang.String">
            <column name="BYZD2" length="50" />
        </property>
        <property name="bz" type="java.lang.String">
            <column name="BZ" length="100" />
        </property>
    </class>
</hibernate-mapping>


[最优解释]
<many-to-one name="users" class="cn.com.sedee.centermanager.hibernate.Users" fetch="select">
            <column name="USERID" precision="22" scale="0" not-null="true" />
</many-to-one>

这个跟lazy属性相关!
Hibernate默认lazy="true"这样你直接查询的时候、由于你配置的是fetch=select、select查出的是N+1条记录,用了lazy=true,延迟加载的话,select在查询时只会查出主表记录,也就是1。
你直接查询i.users数据,此时就会自动在执行查询,查出N(users一方的数据)。
这个时候如果你想每次都自动查询N的一方的数据就配置lazy="false"
[其他解释]
没人遇到过类似的问题吗?
[其他解释]
非常感谢 问题解决了 

热点排行