これは奇妙な問題ですが、そこに行く!Hibernateを使用したflush()メソッドの無限再帰
文脈に入れる: 私はJUnitテストを実装しています。私はsongJPAというクラスをテストしています。私は曲を作って(OK)、同じ名前の曲を作って、Exception(OK)を期待し、最後に最初の曲を削除したい(次回の実行時にエラーがないように)。
問題は、私がDeleteSongTest()を個別に実行すると、それが動作し、私の曲を削除することですが、すべてを実行すると、動作しません、無限再帰で入力します。私はそれがflush()メソッドで起こっていると思うし、デバッグしようとしましたが、不可能です。
私はすべてのクラスを貼り付けています。
JUnitテストのCLASS:
public class SongCRUDTest {
private SongJPA testSong1;
private SongJPA testSong2;
private SongJPAJpaController slc;
@Before
public void setUp() {
testSong1= new SongJPA("TestTitle", 120, 19, new SongInfoJPA(), "TestArtist", Genre.CLASSICAL);
testSong2= new SongJPA("TestTitle", 122, 12, new SongInfoJPA(), "TestArtist2", Genre.BLUES);
slc = new SongJPAJpaController();
}
@Test
public void A_createSong(){
slc.create(testSong1);
}
@Test(expected = PersistenceException.class)
public void B_createDuplicatedTestSong() {
slc.create(testSong2);
}
@Ignore
@Test
public void C_deleteSong() throws NonexistentEntityException{
SongJPA songToDelete= slc.findSongJPAByTitle("TestTitle");
if(songToDelete!=null)
slc.destroy(songToDelete.getId());
}
私が個別に実行したときのみ動作し破壊する方法。 (NetBeansのテンプレートからです)
public void destroy(int id) throws NonexistentEntityException {
EntityManager em = null;
try {
em = getEntityManager();
em.getTransaction().begin();
SongJPA songJPA;
try {
songJPA = em.getReference(SongJPA.class, id);
songJPA.getId();
} catch (EntityNotFoundException enfe) {
throw new NonexistentEntityException("The songJPA with id " + id + " no longer exists.", enfe);
}
em.remove(songJPA);
em.flush();
em.getTransaction().commit();
} finally {
if (em != null) {
em.close();
}
}
}
EDITION1:ヘルプは
public void create(SongJPA songJPA) { EntityManager em = null; try { em = getEntityManager(); em.getTransaction().begin(); em.persist(songJPA); em.getTransaction().commit(); } finally { if (em != null) { em.close(); } } }
秒後に
54587 [main] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 1205, SQLState: 41000 54587 [main] ERROR org.hibernate.util.JDBCExceptionReporter - Lock wait timeout exceeded; try > restarting transaction
TIA()メソッドを作成します!!!!
'create()'メソッドを表示できますか? – axtavt
もちろん@axtavt – migueloop