- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我使用 Spring 3.2.3、Hibernate 4.2.3 和 JDK 7。
我有一个简单的实体:
@Entity
public class Language {
@Id
@GeneratedValue
private long id;
@Column(nullable = false, length = 3, unique = true)
private String code;
}
我使用带有 @Transactional
注释方法的 @Service
注释类保存了该实体的实例,该方法使用 DAO 保存实体
sessionFactory.getCurrentSession().save(object);
之后,我使用saved Language
实体创建EntityX
,它在ManyToOne
关系中使用它...
lang=new Language();
// ...
languageService.saveLanguage(lang);
e=new EntityX();
// ...
e.setLanguage(lang);
otherService.saveEntity(e);
和 EntityX
被定义为 ...
@Entity
public class EntityX {
@ManyToOne
@JoinColumn(nullable = false)
private Language language;
// ...
}
我总是得到异常
Exception in thread "main" org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: somepackage.Language
我尝试按照其他帖子中的建议,在 EntityX
与 Language
的关系中使用一些级联定义,但没有效果。
如果我使用一些 HQL 查询通过其 code
找到它来重新加载已保存的 Language
实体,那么一切正常,但它远非 '不错'。
不幸的是 org.hibernate.Session
的 save(...)
方法没有返回保存的对象。
有人知道如何解决吗?
最佳答案
您是否在单个 @Transactional
方法中编写代码?
如果不是,问题可能是,在调用任何服务方法之后,事务将被提交并清除 session 。当您尝试保存实体时,在 session 中未检测到语言对象并将其作为 transient 实例进行管理并给出错误。
如果您的代码在单个事务下,您是否在保存实体以强制 Hibernate 存储 Language
到数据库并为其分配有效的 之前尝试了
实体?flush()
@Id
毕竟 - 恕我直言 - 如果你依赖于实体和语言,那么最好的选择是:
@ManyToOne(cascade = CascadeType.ALL)
private Language language;
并将您的代码更改为:
e=new EntityX();
Language lang = new Language();
// ...
e.setLanguage(lang);
otherService.saveEntity(e);
并且您不需要分两步(语言+实体)持久化实体;将语言+实体作为单个项目进行管理
PS:org.hibernate.Session 的 save(...) 方法不会返回保存的对象,因为对象将保持不变(引用不会改变),只是对象属性发生了变化(例如标记为 @Id
的属性)!
编辑:
使对象持久化(我的意思是 session.save() )不会导致立即插入/更新;没有级联提示 Hibernate 外观不会检测 EntityX 和 Language 之间的依赖关系,并且在保存 EntityX 之前不会执行 Language 的 sql 插入。
languageService.save(language) 调用不执行 session.flush() 因为你在相同的 @Transactional
下并且没有 session.commit() 不执行 session.flush() 最好的选择是语言对象仍标记为 transient 。
您可以检查一下:提取服务保存代码(语言 entityX)并将所有内容放入单个 @Transactional
并检查 Hibernate 是否仍然给您错误。
我最好的选择仍然是在中间执行 flush() 或更改映射,别无他法
关于java - 对象引用未保存的 transient 实例 : how to flush or return saved object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18293169/
在MySQL中,执行FLUSH TABLES, PRIVILEGES;和执行FLUSH TABLES;再执行FLUSH PRIVILEGES;效果一样吗?此外,这是否适用于任何刷新选项(FLUSH L
在spring security生成类UserRole或 SecUserSecRole (你可以随便叫它)有一个命令可以创建 new UserRole()并用 .save(flush:flush, i
我正在使用 Hibernate 3.2.6。我正面临异常(exception)情况 save the transient instance before flushing 在我的代码中,有时我们在一个
我有一个 StreamWriter,它的底层流是一个 FileStream。以下代码是否保证 FileStream 也将其缓冲区刷新到文件系统上的实际文件中,还是我需要在 上显式调用 Flush()文
我在 ASP.NET Web API 中使用 PushStreamContent 将事件从服务器推送到客户端(使用服务器发送事件)。每次发送事件后,我都会在 Stream 上调用 Flush 以将缓冲
MSDN说FileStream.Flush(True) “还清除所有中间文件缓冲区。”。 “所有中间文件缓冲区”到底是什么意思? 最佳答案 它会将缓冲在文件系统缓存中的文件数据写入磁盘。该数据通常是根
在我的项目中,我有很多嵌套的对象,几天后服务器在每次查询执行时都变得非常缓慢。 我从object.save(flush:true)中删除了flush:true,这应该避免对象立即被数据库持久化,因为我
假设您需要将二进制数据写入标准输出: sys.stdout.buffer.write(data) 然后要刷新它,您可以使用以下两种方法之一: sys.stdout.flush() sys.stdout
我已经覆盖了 std::ostream::flush() 函数。下面我从示例中删除了所有其他代码: #include #include class CMyStream : public std::
我在我的服务中实现了取消 http 请求,我想测试它: angular.module('EmsWeb.Services').factory('DalService', ['$q', '$http',
有这个 Angular 组件: import { Component, OnDestroy, OnInit } from '@angular/core'; import { asyncSchedule
magento的缓存管理中“Flush Magento Cache”和“Flush Cache Storage”有什么区别? 最佳答案 有时,缓存位置(如 /tmp/)或服务(如 Memcache)会
我有一个实现 postFlush() 的 Hibernate 拦截器.据我了解,刷新后是数据已保存到数据库中,但在调用提交之前可能会回滚。如果我有一个看起来像这样的 hibernate 配置: tru
这是我第一次接触 Clojure,所以我尝试编写一个简单的脚本,它提供基于维基百科的翻译(欢迎任何批评/评论) 问题是:当我从翻译中删除(刷新)时,脚本输出 nil 而不是翻译后的单词。这是为什么?我
我正在开发 iPhone 应用程序并希望使用: CFStreamCreatePairWithSocketToHost(NULL, url, port, &serverReadStream, &serv
我有一个相机将图片发送到回调函数,我想使用 FFmpeg 用这些图片制作一部电影。我遵循了 decoding_encoding 示例 here但我不确定如何使用 got_output 刷新编码器并获取
is_master_def: volatile bool is_master_; is_master_ 值被另一个线程设置为 true,但似乎 is_master_ 值 dosnt 刷新(它没有计算出
什么意思 “我会在您将所有内容发送给客户端并刷新后执行此操作。” 谢谢你 最佳答案 刷新是对数据流进行缓冲时涉及的操作。 让我们假设一个普通的stdout 流。每个字节一到达就打印出来效率很低,这就是
我们正在开发 iMX6Sx Freescale 开发板,使用 Yocto 构建 Linux 内核发行版。我想知道是否有办法检查是否有可能检查文件系统操作(特别是写入)是否真的终止,避免在操作仍在进行时
我已经实现了一个 Java 程序,它通过 ServerSocket 从 GPS 设备读取数据。 ServerSocket serverSocket = new ServerSocket(13811);
我是一名优秀的程序员,十分优秀!