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

Spring事务注释、Hibernate和持久化

赖俊
2023-03-14

我对Spring@Transactional注释和persist有一个误解。我使用的是Spring3.1,带有JPA和Hibernate。我认为persist意味着将实体添加到持久性上下文中(但在提交或刷新之前不要执行任何查询),而@Transactional注释意味着用事务包装方法。

然而,在这个简短的例子中,当执行指针到达持久性时,它会失败并出现异常,因为name不能为null(db约束)。

import javax.persistence.EntityManager;

@PersistenceContext
private EntityManager entityManager;

@Transactional
public void test() {
    Brand brand = new Brand();
    entityManager.persist(brand);
    brand.setName("test");
}

如果我交换setName()坚持(),一切正常。然而,我不明白为什么反过来没有,因为我认为任何查询都将在方法结束时构建和执行。

有人能解释一下吗?

共有3个答案

萧晔
2023-03-14

持久化执行"插入"查询。事务注释仅用于启动事务,如果发生异常,则回滚事务。

钱稳
2023-03-14

由于事务注释,它在方法末尾提交。但是新记录是在persist上创建的,任何异常都可以抛出。

在方法结束之前,它仍然可以回滚;我通常用回滚来注释异常。

师增
2023-03-14

在JPA中,一旦一个对象传递给持久化(),它就成为“托管”,作为成为托管的一部分,JPA实现必须为持久化对象生成一个id。

如果id生成基于自动增量(GenerationType.IDENTITY),然后需要向数据库发出插入语句以获取并分配密钥。当id生成基于序列/表时,ID由JPA实现托管的id池管理和分配,在这种情况下,不需要直接插入。

有一个对象被传递到持久性()并且已经被管理,对它的任何更改都是持久性字段,必须刷新到事务的数据库中。在您的情况下,如果id生成是Idid,则必须在更新之后插入。如果id生成是其他方法,那么一个插入语句就足够了。如果事务回滚,则根本不应该将任何SQL发送到数据库。

这是Batoo JPA中的实现。

希望这有意义。

 类似资料:
  • 我需要实现Spring的@Transactional注释,但我无法实现。 在过去的三个星期里,我尝试了很多方法,但没有一个奏效。 我还需要使用EntityManager。为了测试Spring是否有效,我尝试使用@PersistenceContext注入EntityManager(我还尝试使用@PersistenceUnit和/或与EntityManager Factory一起),但我总是得到nul

  • 问题内容: 之间有什么区别? 在整个类中添加“ @Transactional”注释 为每个方法添加“ @Transactional”注释? 使用spring和Hibernate吗? 问题答案: 基本上,如果您用所有方法注释该类,则将是事务性的。如果您不这样做,则可以仅将其标注为所需的方法。此外,你可以为每个方法指定不同的属性,如,,,…

  • 问题内容: 我正在尝试创建事务管理器,并将其与Hibernate for Oracle一起使用。 我的persistence.xml文件是: 在spring的applicationContext.xml中,我添加了: 但是,当我运行时: 我有一个例外: Hibernate基础文件文件除外。 可能是什么问题呢? Hibernate持久性如何知道引用Spring bean? 问题答案: 持久性提供程序

  • 在我们的一个项目中,我们遇到了一个问题,Spring忽略了事务注释,然后失败了,出现了以下错误。 启动ApplicationContext时出错。要显示条件报告,请在启用“调试”的情况下重新运行应用程序。2018-09-13 15:05:18406错误[主]组织。springframework。靴子SpringApplication应用程序运行失败组织。springframework。道。Inva

  • 我将Spring 3.2.4与JavaFX结合使用,并希望实现一种方法,其中操作将在事务中执行。我在控制器中的代码如下所示: 以及我的应用程序上下文: 尝试运行时,我收到以下错误消息: 该方法存在。删除注释,或者将方法从public更改为private,或者从配置中删除bean,程序就会运行,但事务注释根本不起作用。删除代理目标会导致另一个错误。

  • 我正在阅读使用Spring框架的事务管理。在第一个组合中,我使用Spring Hibernate和Hibernate的API来控制事务(Hibernate API)。接下来,我想使用注释进行测试,它确实起了作用。 我感到困惑的是: > JPA、JTA、Hibernate是否有自己的事务管理方式。举个例子,考虑如果我使用Spring Hibernate,在那种情况下,你会使用“JPA”事务吗? 就像