hibernate一对多,更新一方时多方的外键ID更新为null

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate一对多,更新一方时多方的外键ID更新为null相关的知识,希望对你有一定的参考价值。

我在更新一方名称的时候,多方的外键ID自动更新为null这是为什么呢
我在设置了inverse为true后虽然不更新多方的外键了
但是马上查询一方的多方set集合会抛java.lang.NullPointerException这是为什么呢

问题描述太过模糊,请把源码贴出来。你的关系设置是单向关联还是双向关联。更新一方名称,多方的外键ID自动更新为null,唯一的解释就是你删了原来的记录。你的inverse设置在多的一端还是一的一端;查询一方时多方默认为懒加载,事务结束后输出肯定会出空指针异常。追问

多方的

单方的

追答

配置没有问题,一的一方不控制关系。不知道你第一个问题外键自动更新为null明白为什么没有,如果没明白我想看下你写的更新实体源码。第二个问题,多的一方默认是懒加载,如果你使用的是SSH框架,那么你应该在Web.xml文件中加入下面的过滤器,把hibernate的session交给Sping管理,该过滤器作用是当你在页面输出查询内容时session不会被关闭。

openSessionInView

org.springframework.orm.hibernate3.support.OpenSessionInViewFilter

sessionFactoryBeanName
sessionFactory

openSessionInView
*.do

当然也可以不加入该过滤器,直接将多的一方lazy属性设置为false,立即加载,不过这样会影响性能。如果你只使用的hibernate,那么在你将多的一方内容输出时,让hibernate的session不关闭就可以了,内容输出完成后在关闭hibernate的session。

追问

这个是我练习写的 所以没什么规范 麻烦你了 我只用了hibernate没加spring
public void updDepartment(department dp)
Session session = HibernateSessionFactory.getSession();
Transaction t = session.beginTransaction();
session.update(dp);
t.commit();

追答

Department dp如何来的,看这个没用。

追问

修改的PO啊 里面只有id值跟NAME值
查询
public department getDepartment(int id)
department d = null;
System.out.println("查询:"+this.getSession());
d =(department) this.getSession().createQuery("from department where departId=?").setInteger(0, 1).iterate().next();
return d;

追答

给你个例子你参考吧:
Session ssn = HibernateSessionFactory.getSession();
Department d = (Department) ssn.createQuery("from Department
where departId=?").setInteger(0, 1).iterator().next();;
HibernateSessionFactory.closeSession();
ssn = HibernateSessionFactory.getSession();
Transaction tran = ssn.beginTransaction();
d.setName("XXXX");
ssn.update(d);
tran.commit();
HibernateSessionFactory.closeSession();

参考技术A 你到底理解不理解inverse属性?inverse为false的是主动方追问

我知道啊 默认就是false嘛

参考技术B 有一个属性 cascade 好像是这样写的吧 你写上all 就行了 这个是级联更新全部的意思

hibernate学习四 hibernate关联关系映射

在Hibernate中对象之间的关联关系表现为数据库中表于表之间的关系(表之间通过外键关联)。

1 单向的一对一

  主键关联

    外键关联

2 单向的一对多

3 单向的多对一

4 单向的多对多

5 双向的一对一

  主键关联

   外键关联

6 双向的一对多

7 双向的多对多

 

(双向和单向的区别:

单向是用hql查询时只能从一方得到另一方的信息,双向则是从另一方也能得到这一方的信息,但在数据库里,是没有区别的
举个例子:有个user表,还有个group表,它们是多对一关系。在数据库里,user表会有一个group_id字段,是个外键,用来指向group表的id,但在实体类里,如果你只配了多对一单向,即只配置了user表里的多对一关系,那你查询的时候可以这样查,select u.group from User u where u.name="张三",但你不能这样查 ,select g.users from Group g where g.name="管理员" 。 如果你设置了双向关联,则这两种写法都可以查)

 


以上是关于hibernate一对多,更新一方时多方的外键ID更新为null的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate的多表操作

hibernate one-to-many 和 many-to-one

JPA映射关系

hibernate_关联映射_一对多

使用hibernate从一方获取多方信息时报错:org.hibernate.LazyInitializationException: failed to lazily initialize a col

hibernate系列之四