您的位置:首页 > 其它

hibernate使用注解无法进行更新操作的解决方法

2013-11-09 17:06 726 查看
1.一般来说,在多对多的双向关联中,往往是修改频繁的一方放弃外键维护。但在实际运用时要灵活选择,如学生选课中,按照前边那个约定,应该是课程一方维护外键,但若程序中是按照学号查找一个学生选了哪些课,而不是查询一门课由哪些学生选择,则应该由学生端维护外键。否则会出现无法更新课程的问题。如原来的写法

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();

在平时要注意这些小细节。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐