在Play框架中使用JPA更新表

在Play框架中使用JPA更新表,jpa,playframework,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

我正在尝试使用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 updateBlRecordTypes.setFieldlabel(“JPATest”);
我该怎么办。

我看到了一些可能的问题:

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

其次,如果您正在使用模型类(您应该这样做),那么可以使用该类提供的“find”和“findById”方法。建议这样做,而不是直接使用EntityManager

有关更多信息,请参阅

基本上,按照播放方式重做代码以避免出现问题:)

编辑:作为澄清,我并不是真的回答你为什么要得到NPE的问题,但我认为,当你强行进入框架的设置时,你可能(也许不是!)会看到意想不到的工件,一旦你按照惯例修复代码,这些工件将消失


如果在此之后仍然存在错误,请告诉我们:)

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


顺便说一句:我发现用启动事务的方法不必要的方法提交事务是很有问题的。

我已经更改了我的代码,如下所示

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;
}
很好