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"
[其他解释]
没人遇到过类似的问题吗?
[其他解释]
非常感谢 问题解决了