1

当我使用 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)
    }

}
4

1 回答 1

1

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

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

于 2013-10-23T09:35:05.987 回答