当前位置: 首页 > 知识库问答 >
问题:

如何使用JPA/Hibernate设置XACT_ABORT?

祁嘉言
2023-03-14
    String queryString = """set xact_abort on; update table_name set column1 = :column1, column2 = :column2 where id = :id"""
    Query query = entityManager.createNativeQuery(queryString)
    query.setParameter("column1", column1)
    query.setParameter("column2", column2)
    query.setParameter("id", id)
    query.executeUpdate()
@Resource
DataSource dataSource

@Bean
JpaVendorAdapter vendorAdapter(){
    return new HibernateJpaVendorAdapter(database:Database.SQL_SERVER)
}

@Bean
AbstractEntityManagerFactoryBean entityManagerFactory(){
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(dataSource:dataSource, jpaVendorAdapter:vendorAdapter())
    em.setPackagesToScan("com.mycompany.entity")
    return em
}

@Bean
PlatformTransactionManager transactionManager() {
    return new JpaTransactionManager(entityManagerFactory:entityManagerFactory().getObject())
}

共有1个答案

雷硕
2023-03-14

最后,我使用hibernate拦截器为每个insert和update语句添加“SET xact_abort ON”。

这是我的拦截器:

class XactAbortInterceptor extends EmptyInterceptor{
   String onPrepareStatement(String sql) {
      if(sql.startsWith("insert") || sql.startsWith("update"))
         sql = "set xact_abort on; " + sql
      return sql
   }
}

下面是我注册拦截器的地方:

@Bean
AbstractEntityManagerFactoryBean entityManagerFactory(){
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(dataSource:dataSource, jpaVendorAdapter:vendorAdapter())
    em.setPackagesToScan("com.mycompany.entity")
    em.setJpaPropertyMap(["hibernate.ejb.interceptor": XactAbortInterceptor.class.name])
    return em
}
 类似资料:
  • 问题内容: 该EclipseLink的文件说,我需要在我的pom.xml与Maven得到它下面的条目: 但是当我尝试使用注释时,NetBeans告诉我,找不到该类。确实如此:Eclipselink的javax.persistence包中没有Entity类。 我必须如何使用Maven设置Eclipselink? 问题答案: 该工件不提供JPA 2.0 API ,您需要添加: 为了简单起见,我建议使用

  • 问题内容: 我正在使用Hibernate对数据库进行一些大查询,有时会遇到超时问题。我想避免在每个或上手动设置超时。 我可以为Hibernate配置提供任何属性,为我运行的所有查询设置可接受的默认值吗? 如果没有,如何在Hibernate查询上设置默认超时值? 问题答案: JPA 2定义了 javax.persistence.query.timeout 提示以指定默认超时(以毫秒为单位)。Hibe

  • 问题内容: 我在复合主键中的列排序遇到麻烦。我有一个包含以下内容的表: 在此映射中使用它: 当我使用具体的@Table类将AbstractMessage子类化时,hibernate会创建数据库和表而不会出错。问题在于,hibernate会以我想要的相反顺序生成带有列的复合主键。 我希望主键是 因为我知道我最多将有10个位置,但是每个位置有很多时间。 任何帮助将不胜感激=) 问题答案: 我真的不认为

  • 我试图更好地理解JPA/Hibernate和SQL服务器的注释。 我创建了一个简单的项目:一个名为“Articles”的抽象类。有两个类继承了它:Ramette添加了权重,Pen添加了颜色。下面的代码无效,我无法更正错误。你有什么想法吗?非常感谢。

  • 当我为数据库生成DDL时,我不想有任何外键。 根据< code > javax . persistence . constraint mode ,有一个默认值: 那么如何在Hibernate中设置默认值呢? 我在JPA中使用Hibernate通过Spring Boot数据。

  • 问题内容: 现在,我正在制作一个非常简单的网站- 大约5页。问题是,整合某种类型的数据库映射解决方案是否过时且值得花时间,或者仅使用简单的旧JNDI会更好。我可能需要从数据库中读取/写入很多东西。我想我对这些技术有基本的了解,但是仍然需要大量参考文档。还有其他人面对过这个决定吗? 编辑:抱歉,我应该指定JNDI来查找数据库连接和JDBC以执行操作。 问题答案: 简短的答案:这取决于您要支持的复杂性