我设置了一个非常基本的Grails 3 web应用程序,使用jdbc连接到PostgreSQL数据库。下面您可以找到< code>Cluster域类和专用服务的代码。
碰巧用同一个< code>slug参数调用了< code>createCluster方法两次:
clusterService.createCluster('Cluster 1', 'cl01')
clusterService.createCluster('Cluster 2', 'cl01')
导致以下异常
ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - ERROR: duplicate key value violates unique constraint "uk_9ig73x9wropf95ogrffcvyahk" Detail: Key (slug)=(cl01) already exists. [...] null id in myPackage.Cluster entry (don't flush the Session after an exception occurs). Stacktrace follows: org.hibernate.AssertionFailure: null id in myPackage.Cluster entry (don't flush the Session after an exception occurs) at grails.transaction.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:93) ~[grails-core-3.1.1.jar:3.1.1] at com.usablenet.utest.AdminController.clusters(AdminController.groovy:28) ~[main/:na] at grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter.doFilter(GrailsAnonymousAuthenticationFilter.groovy:53) ~[spring-security-core-3.0.3.jar:na] at grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter.doFilter(MutableLogoutFilter.groovy:62) ~[spring-security-core-3.0.3.jar:na] at grails.plugin.springsecurity.web.SecurityRequestHolderFilter.doFilter(SecurityRequestHolderFilter.groovy:58) ~[spring-security-core-3.0.3.jar:na] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_60-ea] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.8.0_60-ea] at java.lang.Thread.run(Thread.java:745) [na:1.8.0_60-ea]
我以为违反唯
一约束会被.validate()
方法拦截,但显然我错了。好吧,所以我添加了一个try/catch,但它基本上没有效果,异常没有被包装,我基本上得到了一个500的内部错误。
我的问题是2:
空 id / 在发生异常错误后不刷新会话
的真正含义是什么?我没有显式刷新会话,当然新记录的id为空...在检查了几个指出相同问题的线程后,其中2个线程暗示要将Hibernate正在使用的数据源的JTA
设置为TRUE
。说我不知道该怎么做,据我所知,JTA更倾向于管理多个数据库之间的多个事务,所以我肯定会说这不是我的情况......我说的对吗?
Cluster.groovy (domain class)
class Cluster {
String name
String slug
static constraints = {
name blank: false, unique: true
slug blank: false, unique: true
}
}
ClusterService.groovy
@Transactional
class ClusterService {
public Cluster createCluster(String name, String slug, boolean flush = false) {
Cluster cluster = new Cluster(name: name, slug: slug)
try {
if(cluster.validate())
cluster.save(flush: flush)
} catch(Exception e) {
e.printStackTrace()
}
return cluster
}
}
应用yml(数据库配置)
dataSource: pooled: true driverClassName: 'org.postgresql.Driver' dialect: 'org.hibernate.dialect.PostgreSQLDialect' username: 'postgres' password: 'postgres' environments: development: dataSource: dbCreate: create url: jdbc:postgresql://localhost:5432/myapp
在从头开始构建演示时,我发现问题不在于我的代码,而在于Grails应用程序的配置(build.gradle
),因为只是更改了依赖项
compile "org.grails.plugins:hibernate"
到
compile "org.grails.plugins:hibernate4"
使问题消失,. valize()
按预期返回false
并且没有抛出错误。
然而,我找不到任何关于Grails 3和Hibernate 3不兼容的注释,最好能找到一个:P
我试图在一个catch块中执行一些更新操作。冬眠例外ConstraintViolationException抛出如下 我正在使用Hibernate 4.3.6 这是我的UserRegistrationRequest实体 这是我的UserSecurityQuestions实体 尝试在catch块中执行更新时,我遇到以下错误 如果我抓住异常而不是约束违反异常看到下面的错误 有人能帮帮我吗,有没有更好的
专家/大师/朋友 我们的应用程序使用Spring 3.2、JPA 2、Hibernate 4.2和MySQL技术栈运行 在阅读了stackoverflow中的几篇文章——这篇文章和这篇文章以及其他几篇文章后,我认为使用EntityManager(在Interceptor中)的读取操作正在触发自动刷新,从而引发异常。但无法确定它是什么。此外,我已经删除了这个简单的实体类以及表(甚至没有外键)中的任何
你好,我是PHP中的web开发人员,最近迁移到javaEE。我在mysql中创建表。这是第一类: . . . 这是我的第二节课: . . .
我有一个hibernate和JSF2应用程序进入部署服务器,突然抛出一个org。冬眠AssertionFailure:异常中的空id。我将立即提供堆栈跟踪和代码,但首先有四个重要问题: > 这只发生在部署服务器(Jboss)上 研究这一点,人们在尝试插入对象时似乎会出现这种错误。但是当我做一个简单的查询时,我得到了错误。(实际上,各种不同的查询,因为错误会随机出现在多个页面上。) 错误只会偶尔出现
我需要从遗留系统进行数据迁移,总共有20,000条记录[所有数据将由csv文件提供],由于一些技术原因,我必须使用JPA/Hibernate将这些数据导入到您当前使用的新系统中。 当我进行导入时,总是遇到如下交易问题: 数据库是 MS SQL Server 2005 org . hibernate . assertion failure:< code > xxxx 条目中的id为空(发生异常后不要
编辑:得到一个-1,你能解释一下为什么吗?我搜索了重复项,但没有找到任何重复项。 为我刚刚遇到的问题发布Q/a: 例外情况: org.hibernate.AssertionFailure: null id in xyz (在发生异常后不要刷新会话)