本文主要是介绍Play框架的@OneToMany、@ManyToOne级联操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
对象之间有一对一,一对多,多对一,多对多的关系,Play框架底层使用hibernate模板,所以可以用注释@OneToOne,@OneToMany,@ManyToOne和@ManyToMany来表示他们之间的关系。但是再利用@ManyToOne进行保存时出现了错误,直到今天才解决。
1. 错误再现
报错如下
大概意思就是在级联保存的时候出错了,在刷新前还没有保存瞬时实例。
代码如下
Model如下:这是和级联相关的一部分
@Entity(name = "houses")
public class Houses extends Model {// 装修程度@OneToOnepublic Decorates decorates;//联系人@OneToMany(cascade=CascadeType.ALL)@JoinColumn(name="house_id")public List<Linkmans> linkman;//发布者@OneToOnepublic Users user;
}
public static void publish(Houses houses, List<Linkmans> linkmansList, Decorates decorates)throws FileNotFoundException {// 保存装修类型decorates.save();houses.decorates = decorates;houses.save();// ***保存联系人操作开始,页面***houses.linkman = linkmansList;for (Linkmans man : linkmansList) {man.house_id = houses.id;man.save();}// ***结束***render("newhouse/success.html");}
1、Hibernate持久化的三种状态:
1) 临时状态(Transient):用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫临时对象;
2) 持久化状态(Persistent):已经持久化,加入到了Session缓存中。如通过hibernate语句保存的对象。处于此状态的对象叫持久对象;
3) 游离状态(Detached):持久化对象脱离了Session的对象。如Session缓存被清空的对象。特点:已经持久化,但不在Session缓存中。处于此状态的对象叫游离对象;
其中多对一可以顺利保存,但是一对多无法保存。这种情况下,如果只有一个联系人可以正常保存,但是多个联系人就无法保存,报以上错误。刷新前没有保存瞬时实例就是说linkmans还在临时状态,没有保存,所以无法级联。
要怎么做才对
// ***保存联系人操作开始,页面***for (Linkmans man : linkmansList) {man.house_id = houses.id;man.save();}houses.linkman = linkmansList;// ***结束***
修改了保存联系人和将房子与联系人级联的先后顺序就正确了。也就是说先把多个联系人依次保存到数据库,从临时状态变成持久化状态,然后再将房子和联系人级联保存,这样就正确了。
总算解决了,有时候解决问题就需要转变一下小思维,嘿嘿。
这篇关于Play框架的@OneToMany、@ManyToOne级联操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!