在Play Framework中使用JPA更新表

时间:2011-08-18 13:39:11

标签: jpa playframework

我正在尝试使用JPA更新表格

EntityManager em=JPA.em();
EntityTransaction entr = em.getTransaction();
try{
if(!entr.isActive())
  entr.begin();
  Tblrecordtypefields updateTblrecordtypes = em.find(Tblrecordtypefields.class,9);
  updateTblrecordtypes.setFieldlabel("JPATest");
  em.getTransaction().commit();
}finally
{
if(entr.isActive())
entr.rollback();
}

我收到了错误 发生NullPointerException:null at updateTblrecordtypes.setFieldlabel( “JPATest”); 我该怎么办。

3 个答案:

答案 0 :(得分:2)

我在那里看到一些可能的问题:

首先,Play自己管理交易。事务在请求开始时创建,并在最后提交(如果异常则回滚)。你试图强行进入它,这是不推荐的。要管理实体,只需执行entity.save()将其标记为“要保存”,不要忽略任何更改。

其次,如果您在Play中使用Model类(如您所愿),则可以使用此类提供的“find”和“findById”方法。建议这样做,而不是直接使用EntityManager。

有关详细信息,请参阅documentation

基本上,重做您的代码以遵循Play方式,以避免问题:)

编辑:作为一个澄清,我并没有真正回答你为何获得NPE的问题,但我认为,当你强行进入框架的设置时,你可能(也许不会!)看到意外一旦您修复代码以遵循约定,将会消失的工件。

如果之后您仍然有错误,请告诉我们:)

答案 1 :(得分:1)

这意味着实体9映射的数据库表中没有ID为Tblrecordtypefields的行。

BTW:我发现在一个不必要的方法中提交事务是非常值得怀疑的。

答案 2 :(得分:0)

我已将代码更改为

Tblrecordtypefields updateTblrecordtypeFields = Tblrecordtypefields.findById(9);
updateTblrecordtypeFields.setFieldlabel("Test");
validation.valid(updateTblrecordtypeFields);
if(validation.hasErrors()) 
{
    updateTblrecordtypeFields.refresh();
}
else
{
    updateTblrecordtypeFields.save();
}

在我的模型类中

public void setFieldlabel(String fieldlabel) {
this.fieldlabel = fieldlabel;
}

工作得很好.....