Hibernate一对多、多对一关系理解

qwwwwwqqqq 2015-10-16 04:24:55
宿舍和学生是一对多的关系,一个宿舍住多个学生;查询宿舍列表的时候,假如一个宿舍里面住着三个学生,当我查询宿舍列表的时候,竟然有三条记录。
以下是数据库结构:
CREATE TABLE hibernate002_classroom(
id INT PRIMARY KEY AUTO_INCREMENT ,
classname VARCHAR(50)
);
CREATE TABLE hibernate002_student(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(50),
age INT,
room_id INT
);

INSERT INTO hibernate002_classroom VALUES(1,'留学生宿舍'),(2,'本地人宿舍');
INSERT INTO hibernate002_student VALUES(1,'zhangsan',20,1),(2,'lisi',20,1),(3,'wangmazi',20,1);
INSERT INTO hibernate002_student VALUES(4,'张三',20,2),(5,'李四',20,2),(6,'王麻子',20,2);


以下是Java实体,省略了getter和setter:
package com.city.test.hibernate.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name="hibernate002_student")
public class Student {
@Id
@Column(name="ID")
private Long id;
@Column(name="NAME")
private String name;
@Column(name="AGE")
private Integer age;

/*@Column(name = "ROOM_ID")
private Long roomId;
public Long getRoomId() {
return roomId;
}
public void setRoomId(Long roomId) {
this.roomId = roomId;
}*/

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="ROOM_ID",referencedColumnName="ID")
private Room room;
}

package com.city.test.hibernate.entity;

import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name="hibernate002_classroom")
public class Room {
@Id
@Column(name = "ID")
private Long id;
@Column(name = "CLASSNAME")
private String name;

@OneToMany(fetch = FetchType.EAGER , mappedBy = "room")
private List<Student> students;
public List<Student> getStudents() {
return students;
}
}


预期的结果本来是,我查询宿舍列表的时候,返回正确的宿舍的信息,宿舍里面能获取到所住学生的信息,但是查询以后竟然得不到宿舍的正确信息。通过以下的查询,查出的结果竟然是Student和Room联合查询的结果。求住大神。。。。。

DetachedCriteria criteria = DetachedCriteria.forClass(Room.class);
return getHibernateTemplate().findByCriteria(criteria);


单元测试,
for (Room room : list) {
logger.info(room);
logger.info(room.getStudents().size());
}


结果显示:
...全文
330 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qwwwwwqqqq 2016-08-02
  • 打赏
  • 举报
回复
引用 2 楼 musehilt 的回复:
HashSet set = new HashSet(list); 正好学习hibernate也看书看到这里
这个方法确实不错,实验了一下。果然没问题
qwwwwwqqqq 2016-08-02
  • 打赏
  • 举报
回复
引用 1 楼 qq_17616133 的回复:
你确定关系搞清楚了? 宿舍的id依然只有1和2 有什么不对吗?
但是数据出现了6次
musehilt 2015-10-20
  • 打赏
  • 举报
回复
HashSet set = new HashSet(list); 正好学习hibernate也看书看到这里
salory 2015-10-20
  • 打赏
  • 举报
回复
给楼主提个建议,在程序开发中是最好不用外键的,这样会导致程序很难维护,并且数据关系过于复杂,这个多对一映射了解一下就好。 这里不配置懒加载用这个多对一关系映射是没有意义的 多对一映射中一般用Set结果集而不用List
  • 打赏
  • 举报
回复
看你打印出的结果,应该要看你的 “DetachedCriteria criteria = DetachedCriteria.forClass(Room.class); return getHibernateTemplate().findByCriteria(criteria);” 这块里面的代码是怎么处理的了,按你所说想要的结果应该是这样的 List<Room> rooms,[{1,'留学生宿舍',[所住学生集合]},{2,'本地人宿舍',[所住学生集合]}] 用hql查也可以得到同样的效果: " from Room.class.getName() "
penghao19889527 2015-10-20
  • 打赏
  • 举报
回复
只有1,2 选 没有2.3.4.5
千兵卫 2015-10-19
  • 打赏
  • 举报
回复
你确定关系搞清楚了? 宿舍的id依然只有1和2 有什么不对吗?

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧