2011-10-08 55 views
2

我有一個java項目,其中包含執行簡單更新的單元測試集合,使用JPA2進行刪除。單元測試運行沒有問題,我可以驗證數據庫中的更改 - 都很好。我試圖在處理程序中複製/粘貼這個相同的函數(Smartfox Extension) - 我收到一個回滾異常。JPA RollbackException但未進行單元測試

列'levelid'不能爲空。

尋找建議,爲什麼這可能是。我可以從這個擴展(GetModelHandler)中執行數據讀取,但試圖設置數據不起作用。這完全是莫名其妙的。

因此,在總結 -

這工作...

@Test 
public void Save() 
{ 
    LevelDAO dao = new LevelDAO(); 
    List levels = dao.findAll(); 
    int i = levels.size();  
    Level l = new Level();   
    l.setName("test"); 
    Layer y = new Layer(); 
    y.setLayername("layer2"); 
    EntityManagerHelper.beginTransaction(); 
    dao.save(l); 
    EntityManagerHelper.commit(); 
} 

這種失敗,回滾例外

public class SetModelHandler extends BaseClientRequestHandler 
{ 
@Override 
public void handleClientRequest(User sender, ISFSObject params) 
{ 
    LevelDAO dao = new LevelDAO(); 
    List levels = dao.findAll(); 
    int i = levels.size();  
    Level l = new Level();   
    l.setName("test"); 
    Layer y = new Layer(); 
    y.setLayername("layer2"); 
    EntityManagerHelper.beginTransaction(); 
    dao.save(l); 
    EntityManagerHelper.commit(); 
} 

} 

水平和圖層類有一對多和多對一屬性。

任何想法appeciated。

更新

這裏的架構

Level 
-------- 
levelid (int) PK 
name  (varchar) 


Layer 
-------- 
layerid  (int) 11 PK 
layername (varchar) 100 
levelid (int) 
      Foreign Key Name:Level.levelid , 
      On Delete: no action, 
      On Update: no action 

當我改變

EntityManagerHelper.beginTransaction(); 
dao.update(l); 
EntityManagerHelper.commit(); 

EntityManagerFactory factory = Persistence.createEntityManagerFactory("bwmodel"); 
EntityManager entityManager = factory.createEntityManager(); 
    entityManager.getTransaction().begin(); 
dao.update(l); 
    entityManager.persist(l); 
    entityManager.getTransaction().commit(); 

這執行保存但不是更新?我在這裏錯過了很明顯的東西。

+0

您可以發佈您的數據庫架構供我們查看嗎? –

回答

0

我可以看到的最可能的問題將是不同的數據庫定義。測試EJB通常使用即時生成的內存數據庫。而在實際生產中,您正在使用一個真正的數據庫,這可能會強制約束。

嘗試爲levelid值分配值或更改數據庫架構。