2011-10-08 57 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值分配值或更改数据库架构。