记录一次Hibernate一对多插入问题

前言

在一次web项目中,其场景为员工与部门的关联关系,在员工表生成一个外键对应其部门表的主键,配置的为一对多关联关系,当插入数据时却出现了员工表外键为null的情况。


员工类

基于hibernate注解配置,getter与setter方法不再列出,只列出了其对应字段。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Entity
@Table(name="p_users")
public class P_user {
@Id
@GeneratedValue(generator="mygener")
//整长策略
@GenericGenerator(name="mygener",strategy="native")
private int id;
@Column(name="names",length=20,nullable=true,unique=false)
private String names;
@Column(name="sex",length=10,nullable=true,unique=false)
private String sex;
@Column(name="iphone",length=40,nullable=true,unique=false)
private String iphone;
@Column(name="email",length=45,nullable=true,unique=false)
private String email;
@Column(name="states",length=10,nullable=true,unique=false)
private String states;

部门类

基于hibernate注解配置,getter与setter方法不再列出,只列出了其对应字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Entity
@Table(name="dept")
public class Dept {
@Id
@GeneratedValue(generator="mygener")
@GenericGenerator(name="mygener",strategy="native")
private int id;
@Column(name="ename",length=30,nullable=true,unique=false)
private String ename;
@Column(name="datas",length=40,nullable=true,unique=false)
private String datas;
//注解配置一对多关联关系
@OneToMany(targetEntity=P_user.class,cascade=CascadeType.ALL)
//外键名称
@JoinColumn(name="dept_id")
private Set<P_user> puser = new HashSet<P_user>();

原Test测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SessionFactory sessionFactory = SessionFacUtil.getsessionFactory();//加载配置
Session session = sessionFactory.openSession();//创建session
Transaction tx = session.beginTransaction();//开启事务
P_user user = new P_user ();
user.setNames("张三");
Set<P_user> sets = new HashSet<P_user>();
sets.add(user);
//查询已有的部门
Dept dept = session.get(Dept.class, 12);
//将该人员类加入到部门的set集合中,并产生外键联系
dept.setUsers(sets);
session.save(dept);
tx.commit();
session.close();
sessionFactory.close();

运行测试无异常,查看数据库也正常插入了数据
数据库显示为:

可见以正常插入,并与产生了外键,可当再次运行测试类,再次插入时出现了问题,新运行的插入的插入成功了,可第一次插入的数据外键却变成了null,也就是说,只能存在这一个外键,不能有两个。
如图:

这就让我感到很是疑惑,一对多,由表可知,一个部门下可以有多个部门的,不应该会出现这种null的情况的,一开始以为配置的问题,检查了好多配置地方,也在网上搜寻了一大圈,最后还是无果。

正当我一筹莫展的时候,突然发现了一句关键的话

Set<P_user> sets = new HashSet<P_user>();

没错,就是它,我怀疑是不是这个set集合的问题,每次运行new后都产生新的集合,然后再把集合加入dept中,再执行数据插入,会不会是这个的影响,于是改造了以下新的测试类

新Test测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
SessionFactory sessionFactory = SessionFacUtil.getsessionFactory();//加载配置
Session session = sessionFactory.openSession();//创建session
Transaction tx = session.beginTransaction();//开启事务
P_user user = new P_user ();
user.setNames("张三3");
//查询已有的部门
Dept dept = session.get(Dept.class, 12);
//将该人员类加入到该查询出来的dept的set集合中
dept.getUsers().add(user);
session.save(dept);
tx.commit();
session.close();
sessionFactory.close();

测试结果完美通过
数据库截图:

结言

就是这个每次new的set集合问题,结果执行时有让数据库update的了以下,把第一次插入的数据变为了null。

一次小小的细节问题,也体现出看来我对hibernate了解学习的还不够透彻,还需努力专研。