Play框架的@OneToMany、@ManyToOne级联操作

2023-12-10 22:48

本文主要是介绍Play框架的@OneToMany、@ManyToOne级联操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

对象之间有一对一,一对多,多对一,多对多的关系,Play框架底层使用hibernate模板,所以可以用注释@OneToOne,@OneToMany,@ManyToOne和@ManyToMany来表示他们之间的关系。但是再利用@ManyToOne进行保存时出现了错误,直到今天才解决。

1. 错误再现

报错如下

错误.jpg

大概意思就是在级联保存的时候出错了,在刷新前还没有保存瞬时实例。

代码如下

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级联操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/478613

相关文章

SpringBoot操作MaxComputer方式(保姆级教程)

《SpringBoot操作MaxComputer方式(保姆级教程)》:本文主要介绍SpringBoot操作MaxComputer方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的... 目录引言uqNqjoe一、引入依赖二、配置文件 application.properties(信息用自己

Python结合Flask框架构建一个简易的远程控制系统

《Python结合Flask框架构建一个简易的远程控制系统》这篇文章主要为大家详细介绍了如何使用Python与Flask框架构建一个简易的远程控制系统,能够远程执行操作命令(如关机、重启、锁屏等),还... 目录1.概述2.功能使用系统命令执行实时屏幕监控3. BUG修复过程1. Authorization

C#中的 Dictionary常用操作

《C#中的Dictionary常用操作》C#中的DictionaryTKey,TValue是用于存储键值对集合的泛型类,允许通过键快速检索值,并且具有唯一键、动态大小和无序集合的特性,常用操作包括添... 目录基本概念Dictionary的基本结构Dictionary的主要特性Dictionary的常用操作

C# winform操作CSV格式文件

《C#winform操作CSV格式文件》这篇文章主要为大家详细介绍了C#在winform中的表格操作CSV格式文件的相关实例,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录实例一实例效果实现代码效果展示实例二实例效果完整代码实例一实例效果当在winform界面中点击读取按钮时 将csv中

SpringBoot集成图片验证码框架easy-captcha的详细过程

《SpringBoot集成图片验证码框架easy-captcha的详细过程》本文介绍了如何将Easy-Captcha框架集成到SpringBoot项目中,实现图片验证码功能,Easy-Captcha是... 目录SpringBoot集成图片验证码框架easy-captcha一、引言二、依赖三、代码1. Ea

Gin框架中的GET和POST表单处理的实现

《Gin框架中的GET和POST表单处理的实现》Gin框架提供了简单而强大的机制来处理GET和POST表单提交的数据,通过c.Query、c.PostForm、c.Bind和c.Request.For... 目录一、GET表单处理二、POST表单处理1. 使用c.PostForm获取表单字段:2. 绑定到结

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE