【问题标题】:JPA 2 / Hibernate / MySql GenerationType.AUTOJPA 2 / Hibernate / MySql GenerationType.AUTO
【发布时间】:2013-11-01 11:44:15
【问题描述】:

当我使用 GenerationType.IDENTITY 或 GenerationType.AUTO 作为我的表 id 并且我在事务中保留一个实体时,数据会立即插入,并且在事务结束之前插入!!!

我尝试更改 GenerationType.TABLE,在我的 MYSQL 数据库中生成并执行新的关联 DDL,现在它可以工作了。 谁能解释一下为什么?

摘录:

@Table
@Entity
public class Foo implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id", nullable = false, unique = true)
    private Long id;

        ...
}


@Repository
public class EntityDaoServiceImpl {

    @PersistenceContext
    protected EntityManager em;

        @Transactional
    public void testFooCreation() {
            Foo foo = new Foo();
            em.persit(foo);
            //at this point with the AUTO or IDENTITY strategie, 
            //i ve got an effective insert in base otherwise with the TABLE strategie, 
            //the insert is effective at the end of my transaction (the excepted behavior)
    }

}

【问题讨论】:

  • i ve got an effective insert in base 你是怎么检查的? (在 em.persist(); 之后添加一个虚拟 System.out.println("Breakpoint"); 。在此处设置一个断点并使用外部工具查看您的表 Foo 以查看新行是否真的在您的数据库中似乎是一个好方法。你做了吗那个?)

标签: hibernate jpa


【解决方案1】:

它按预期工作,因为没有人说在事务未完成之前不会在数据库中进行插入。这个想法是 JPA 提供程序(在您的情况下为 Hibernate)决定自己何时刷新数据库,并且似乎在 GenerationType.TABLE 的情况下它决定尽早进行。但是,因为进行了刷新,这并不意味着事务已完成/提交:在持久化之后,您/或 JPA 提供程序可以回滚事务,并且该行将不会保留在数据库中。

PS:我希望你对事务有一些背景知识(谷歌了解事务隔离级别)和/或 MySql 的存储引擎(InnoDB 是事务引擎,而 MyIsam 不是)。

【讨论】:

  • 我将 InnoDB 用于事务引擎,但使用 GenerateType.AUTO,在持久化之后,插入行,我总是在事务中,如果我终止我的进程,行仍然在数据库中,我没有任何回滚。
  • 您是否尝试过在持久化实体后立即抛出 RuntimeException,而不是终止进程?您是否尝试过查看 Hibernate 的日志,以查看事务是否/如何开始以及回滚/提交?
  • 非常感谢 Andrei 和 Ben75 提供的所有这些精度,对我来说,我对持久性上下文中的数据感到困惑,并将数据从持久性上下文刷新到数据库,但我现在明白了。所以我把目光移开,我得到了答案!我将 InnoDb 方言用于 hibernate.dialect 属性,但我的表是在没有 ENGINE=InnoDB 的情况下创建的 !!!!!!!!!
猜你喜欢
  • 1970-01-01
  • 2016-04-21
  • 2018-07-28
  • 1970-01-01
  • 2016-12-06
  • 2014-01-27
  • 1970-01-01
  • 2012-04-06
  • 2018-08-12
相关资源
最近更新 更多