1

テーブルIDに GenerationType.IDENTITY または GenerationType.AUTO を使用していて、トランザクション内のエンティティを永続化すると、データが即座に挿入され、トランザクションが終了する前に!!!

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

トランザクションが終了するまでDBに挿入が行われないと誰も言っていないので、期待どおりに機能します。アイデアは、JPAプロバイダー(あなたの場合はHibernate)がデータベースへのフラッシュをいつ行うかを決定し、その場合はGenerationType.TABLE早い段階でフラッシュを行うことを決定したようです。ただし、そのフラッシュが行われるため、トランザクションが終了/コミットされたことを意味するわけではありません。永続化した後、JPAプロバイダーはトランザクションをロールバックでき、行はDBに残りません。

PS: トランザクション (トランザクション分離レベルは google) および/または MySql のストレージ エンジン (InnoDB はトランザクション エンジンであり、MyIsam はそうではありません) についての背景知識があることを願っています。

于 2013-10-23T09:35:05.987 に答える