- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在我的 java 应用程序中,我使用 Hibernate Envers 来监听持续事件。我的监听器类看起来像这样。
@Component
public class DataCreationListener extends EnversPostInsertEventListenerImpl {
private static final long serialVersionUID = 1L;
@Autowired
DataService DataService;
public DataCreationListener() {
super(null);
}
@Override
public void onPostInsert(PostInsertEvent event) {
if (event.getEntity() instanceof DataDAO) {
Data Data = DataService.fromDao((DataDAO) event.getEntity());
// other stuff
}
}
}
在 fromDAO
方法中,我将 DAO
(实体类型)对象转换为 api 类型对象。这是fromDAO
方法
@Override
public Data fromDao(DataDAO data) {
if (data == null) {
return null;
}
Data api = new Data();
api.setId(data.getIdUser());
api.setAddress(data.getAddress());
api.setCity(data.getCity());
api.setCountry(getCountryFromId(data.getId()));
return api;
}
执行getCountryFromId(data.getId())
时出现错误
该方法涉及错误发生的Spring Data JPA存储库调用。存储库调用如下所示
repository.findByCountry_Id(dataId);
在调试时我发现 dataId 有一个非空值,存储库是非空的,查询应该给出一个有效的结果。但是不知何故发生了这个错误
04:15:10.504 [http-nio-8080-exec-2] ERROR org.hibernate.AssertionFailure - HHH000099: an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session): org.hibernate.AssertionFailure: null id in my.app.dbAccess.models.DataDAO entry (don't flush the Session after an exception occurs)
org.hibernate.AssertionFailure: null id in my.app.dbAccess.models.DataDAO entry (don't flush the Session after an exception occurs)
at org.hibernate.event.internal.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:60)
at org.hibernate.event.internal.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:175)
at org.hibernate.event.internal.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:135)
at org.hibernate.event.internal.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:216)
at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:85)
at org.hibernate.event.internal.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:44)
at org.hibernate.internal.SessionImpl.autoFlushIfRequired(SessionImpl.java:1251)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1319)
at org.hibernate.internal.QueryImpl.list(QueryImpl.java:87)
at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:606)
at org.hibernate.jpa.internal.QueryImpl.getSingleResult(QueryImpl.java:529)
at org.springframework.data.jpa.repository.support.SimpleJpaRepository.count(SimpleJpaRepository.java:486)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:503)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:488)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:460)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:280)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:133)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
at com.sun.proxy.$Proxy137.count(Unknown Source)
at my.app.dbAccess.generated.proxy.CountryRepositoryImpl.findByCountry_Id(CountryRepositoryImpl.java:800)
at my.app.services.DataServiceImpl.getCountryFromId(DataServiceImpl.java:131)
at my.app.services.DataServiceImpl.fromDao(DataServiceImpl.java:109)
at my.app.services.DataServiceImpl.fromDao(DataServiceImpl.java:1)
at my.app.services.DataServiceImpl.fromDao(DataServiceImpl.java:118)
at my.app.services.DataServiceImpl.fromDao(DataServiceImpl.java:1)
at my.app.services.DataServiceImpl$$FastClassBySpringCGLIB$$72be48ea.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:651)
at my.app.services.DataServiceImpl$$EnhancerBySpringCGLIB$$c0525c49.fromDao(<generated>)
at my.app.event.consumers.DataCreationListener.onPostInsert(DataCreationListener.java:40)
at org.hibernate.action.internal.EntityIdentityInsertAction.postInsert(EntityIdentityInsertAction.java:156)
at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:102)
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:597)
是因为我正在从 onPostInsert 方法进行查询吗?通过这种方法进行查询不安全吗?我没有在数据中看到任何问题,我的直觉是它与 hibernate 环境有关,但我无法弄清楚。有人可以指出我正确的方法吗?谢谢!!
最佳答案
Is it because I am making a query from ithe onPostInsert method?
很有可能。据我所知,查询触发了预先刷新。
您更有可能使用 Hibernate 生成的 ID(很可能是数据库生成的)。
Is doing a query from this method not safe?
根据具体情况,它可能不安全。
可以肯定的是,它会破坏批量/批量插入,严重降低性能。
尝试暂停当前事务以防止刷新并在外部执行查询。
您可能会得到过时的结果,但在本例中这似乎不是问题。
不知道如何在 spring 中执行此操作,在 JavaEE 中,您可以调用 EJB 方法,例如:
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) // alternatively use REQUIRES_NEW
public Country getCountryFromId(Object id) {
....
}
我确定有一个 spring 等价物。
i don't see any problem in the data, my hunch is that it has something to do with hibernate envers but I can't figure out.
数据有问题:ID为空-尚未分配。
我使用应用程序生成的 ID(通常是 UUID 或 SUID)来避免此类问题。
Envers 也对监听器执行审计,但在 ST 中没有证据,我们也不知道哪个监听器先运行 - 你的还是 Envers。
在这两种情况下,这似乎都不相关。我会先检查其他内容(防止自动刷新)。
关于java - Hibernate Envers : an assertion failure occured (this may indicate a bug in Hibernate, 但更有可能是由于 session 的不安全使用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44599151/
谁能用一个例子来解释 BooleanQuery 中 lucene 中的 BooleanClause.Occur.Must 和 BooleanClause.Occur.SHOULD 之间的区别? 最佳答
正如标题所说,multiset 在所有相同值的范围末尾插入一个值。 (例如:在多重集 1,2,2,3 中插入 2 使其成为 1,2,2,/*new*/2,3)。 如何在所有相同值范围的开头插入新值?
所以这是与此(Inserting in a multiset: before the first occurence of that value instead of after the last o
我试图从我的 WCF .Net Framework 4.5 向 API rest 发布一个文件。这是我的代码: public string CreateConclusion(string[] inst
我的 SQL 查询获取固件的错误修复验证列表,例如def-456 是一张票,要求我对产品进行固件测试。 def-456 有几个记录结果的子任务。结果记录为:id:abc-123、abc-124、abc
我想删除文件中多次出现的行,但想保留某些行。我该怎么做? 这是我的文件的一部分,我想更改它: §M: 1, K: 2 name, time, cycle, instr, L1-mi
我正在 SSMS 中测试 SQL 2016 Live Query Stats,每次尝试时都会收到错误消息“执行批处理时出错。错误消息是:发生一个或多个错误。”并且不返回任何结果集。一位同事试过了,对他
我们在 JBoss 4.2 上设置了一个水平集群。在我们将缓存模式从 REPL_ASYNC 更改为 REPL_SYNC 以解决问题之前, session 复制工作正常。我们开始看到一些 session
我正在尝试将 MVC 网站发布为 Azure 网络角色。 当我在本地运行它时,一切正常。 但是当我将其发布到 Azure 并浏览某些 MVC 操作时,我收到此错误: Server Error in '
假设一个静态库 libfoo 依赖于另一个静态库 libbar 的某些功能。这些和我的应用程序都是用 D 编写的。如果我的应用程序只直接使用 libfoo,并且只调用 libfoo 中的函数而不引用
我正在尝试在 Eclipse Helios 上安装 SVN 客户端, 我已经从 Collaboration 节点安装了所有 SVN 模块(更新中), 现在重启后我可以选择一个连接器 出现“颠覆性连接器
我在 cakephp 中有一些代码会产生错误。 这是 PHP Controller : $this->loadModel( 'Vote' ); //Newly added by amit start
我需要有关 Java 代码的帮助。 这就是问题所在: 输入示例:AaaaaAa 输出:A 出现 7。 问题是我需要它来忽略案例。 请帮助我,我的代码工作正常,只是它不忽略大小写。 import jav
我正在为 J2ME 开发一个应用程序,有时它完全卡住并且 AMS 需要相当长的时间来关闭它.在我看来,这像是一个死锁问题。 你能告诉我什么会导致死锁吗?例如,如果对象调用其自身的另一个同步方法,调用对
尝试将 DEXguard 安装到 Eclipse 中的简单应用程序时出现以下错误: Errors occurred during the build. Errors running builder '
在 SAS 中,假设我有一个名为“person_groups”的数据集。它有两个变量,名为“person”和“group”。该数据集只是将每个人分配到一个组。 我如何从这个数据集中删除所有在他们的组中
有人知道如何在表达式中找到第 n 次出现的字符串以及如何用正则表达式替换它吗? 例如我有以下字符串 txt sub("(^(.*?-){4}.*?)-(.*?-.*?)-", "\\1|\\3||"
是否有一个包允许我为同一个缓冲区设置多个 Occur 结果缓冲区(例如 grep-a-lot: http://www.emacswiki.org/emacs/grep-a-lot.el )。 我在分析
我一直在寻找这个,但似乎无法找到它。 我有一个带有 try {} catch {} 语句的脚本。如果没有发生错误,我想添加一个操作。 例如 try { something } catch { "Err
我正在从 iPhone 应用程序将照片上传到 Facebook。我已经让它工作了,只是有时它会返回“发生未知错误”。我不确定问题是什么。这种情况发生的概率约为 75%。 其他人也遇到过这种情况吗? 最
我是一名优秀的程序员,十分优秀!