篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate一对多,更新一方时多方的外键ID更新为null相关的知识,希望对你有一定的参考价值。
问题描述太过模糊,请把源码贴出来。你的关系设置是单向关联还是双向关联。更新一方名称,多方的外键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();
在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="管理员" 。 如果你设置了双向关联,则这两种写法都可以查)