hibernate使用注解无法进行更新操作的解决方法
2013-11-09 17:06
726 查看
1.一般来说,在多对多的双向关联中,往往是修改频繁的一方放弃外键维护。但在实际运用时要灵活选择,如学生选课中,按照前边那个约定,应该是课程一方维护外键,但若程序中是按照学号查找一个学生选了哪些课,而不是查询一门课由哪些学生选择,则应该由学生端维护外键。否则会出现无法更新课程的问题。如原来的写法
Course和Student实体类
更新的代码
此时就无法更新。改一下mappedBy位置,由学生端维护外键即可。
2.还有一种情况就是hibernate更新机制与以往的servlet不同,servlet是先根据id获取对象然后再修改。在hibernate中,更新对象数据时,会先从一级缓存中将该对象取出来,然后把获取的各项数据和缓存中的数据项比较,如果没有改变就不进行update操作。在hibernate中若按照以前的写法,靠id获取对象和缓存中的对象是一样的,所以不修改。如
在平时要注意这些小细节。
Course和Student实体类
@Entity @Table(name="t_course") public class Course { @Id @GeneratedValue private int cid;//课程id private String cname; @ManyToMany @JoinTable(name="stu_course", //关于中间表的处理,表名 joinColumns={@JoinColumn(name="cid")}, //中间表的字段名 inverseJoinColumns={@JoinColumn(name="sid")} ) private Set<Student> setstu = new HashSet<Student>(); /*****************************************************************/ @Entity @Table(name="t_stu") public class Student { @Id @GeneratedValue private int sid;//学生id private String sname; private String pwd; @ManyToMany(mappedBy="setcourse") private Set<Course> setcourse = new HashSet<Course>();
更新的代码
public void selectCourse(int sid,Integer[] cids){//注意这儿cids为数组 Session session = HiberUtil.getsession(); session.beginTransaction(); Student stu = (Student) session.get(Student.class, sid);//从session里获取的为持久态对象 Set<Course> setcourse1 = new HashSet<Course>(); for (int i = 0; i < cids.length; i++) { Course c = (Course) session.get(Course.class, cids[i]); setcourse1.add(c); } stu.setSetcourse(setcourse1); //session.update(stu);//不写这句也可,因为stu为persistent状态 //setcourse1是瞬时态的,因为它每次都是new出新的一个。相当于每次都是把选的课清空,再添加进课程表中, //所以可把update删除 session.getTransaction().commit(); }
此时就无法更新。改一下mappedBy位置,由学生端维护外键即可。
2.还有一种情况就是hibernate更新机制与以往的servlet不同,servlet是先根据id获取对象然后再修改。在hibernate中,更新对象数据时,会先从一级缓存中将该对象取出来,然后把获取的各项数据和缓存中的数据项比较,如果没有改变就不进行update操作。在hibernate中若按照以前的写法,靠id获取对象和缓存中的对象是一样的,所以不修改。如
session.beginTransaction(); session.update(session.get(News.class, id)); //session.update(news); session.getTransaction().commit(); //此时就无法更新 //这是可以更新的写法 ss.beginTransaction(); news.setNewsTitle(news.getNewsTitle());//需要set进去 news.setContent(news.getContent()); //ss.update(ss.get(News.class, id)); ss.update(news); ss.getTransaction().commit();
在平时要注意这些小细节。
相关文章推荐
- sql2005还原数据库时提示:数据库正在使用,无法进行操作的解决方法
- sql server 还原数据库时提示数据库正在使用,无法进行操作的解决方法
- 无法使用此Apple ID 进行更新的解决方法
- sql server 还原数据库时提示数据库正在使用,无法进行操作的解决方法
- sql server 还原数据库时提示数据库正在使用,无法进行操作的解决方法
- sql server 还原数据库时提示:数据库正在使用,无法进行操作的解决方法
- sql server 还原数据库时提示数据库正在使用,无法进行操作的解决方法
- sql server 还原数据库时提示:数据库正在使用,无法进行操作的解决方法
- sql server 还原数据库时提示数据库正在使用,无法进行操作的解决方法
- sql server 还原数据库时提示:数据库正在使用,无法进行操作的解决方法2
- sql server 还原数据库时提示数据库正在使用,无法进行操作的解决方法
- Node.js使用orm2进行update操作时关联字段无法修改的解决方法
- sql server 还原数据库时提示数据库正在使用,无法进行操作的解决方法
- 关于asp.net网站发布后,使用登录控件和注册控件时出现“数据库只读,无法进行数据更新”的解决方法
- (应用程序无法正常启动0xc0000142) 关于win10周年版更新后无法正常使用vc6.0问题的解决方法
- '操作必须使用一个可更新的查询'解决方法
- Windows 10 1607(周年更新)后加入域无法使用WIndows Hello解决方法
- 【Window OS】”对于目标文件系统,文件XXXXX过大“导致无法进行文件操作的解决方法
- 解决使用VS2010时,引用外部dll时提示,无法嵌入互操作类型“……”,请改用适用的接口的解决方法
- hibernate4中使用Session doWork()方法进行jdbc操作(代码)