Java EJB实体:数据库行从实体自动更新,无需保存在EJB中
该方法从数据库加载一个用户实体bean并返回它,但在执行此操作之前,会清除密码(将其设置为null)。问题是,在数据库本身中,密码设置为null,即使我没有Java EJB实体:数据库行从实体自动更新,无需保存在EJB中,java,ejb,Java,Ejb,该方法从数据库加载一个用户实体bean并返回它,但在执行此操作之前,会清除密码(将其设置为null)。问题是,在数据库本身中,密码设置为null,即使我没有合并或任何其他更新实体的方法。有什么想法吗 public UserEntity loadFromDB (int userid) throws NotFoundException { UserEntity user = em.find(UserEntity.class, userid); if (user == null)
合并
或任何其他更新实体的方法。有什么想法吗
public UserEntity loadFromDB (int userid) throws NotFoundException {
UserEntity user = em.find(UserEntity.class, userid);
if (user == null)
throw new NotFoundException();
user.setPassword(null);
return user;
}
似乎在事务中调用了方法
loadFromDB
,因此您的实体被附加
,并在事务关闭时被保存
DAO或服务层在类级别标记了事务,因此该方法位于事务中
entityManager.getTransaction().begin();
// updates to entity
entityManager.getTransaction().commit(); //Saves all updates to DB
若您的方法是事务的一部分,那个么它基本上是在事务的开始和结束时添加到下面,并且它将向事务中的所有实体提交更新
entityManager.getTransaction().begin();
// updates to entity
entityManager.getTransaction().commit(); //Saves all updates to DB
您可以通过在视图层中的事务外部进行更新,或者将该方法标记为不属于事务的一部分来避免这种情况
entityManager.getTransaction().begin();
// updates to entity
entityManager.getTransaction().commit(); //Saves all updates to DB
通过添加
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
似乎在事务中调用了方法
loadFromDB
,因此您的实体被附加
,并在事务关闭时被保存
DAO或服务层在类级别标记了事务,因此该方法位于事务中
entityManager.getTransaction().begin();
// updates to entity
entityManager.getTransaction().commit(); //Saves all updates to DB
若您的方法是事务的一部分,那个么它基本上是在事务的开始和结束时添加到下面,并且它将向事务中的所有实体提交更新
entityManager.getTransaction().begin();
// updates to entity
entityManager.getTransaction().commit(); //Saves all updates to DB
您可以通过在视图层中的事务外部进行更新,或者将该方法标记为不属于事务的一部分来避免这种情况
entityManager.getTransaction().begin();
// updates to entity
entityManager.getTransaction().commit(); //Saves all updates to DB
通过添加
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
谢谢,DAO类是从一个无状态会话bean调用的,在任何地方都没有更新指令或开始事务。UserEntity user=em.find(UserEnt.class,userid);告诉我它正在事务中运行它必须在事务中运行,因为我使用
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
设置了方法,如您所示,并且该行不再更新。使用find
意味着您启动了一个事务?我只需要加载行。因此,每当我使用只读方法(即加载记录时不需要更新)时,我需要显式地向容器指示不要启动事务?EJB将把您的实体视为数据库行,事务中对实体的任何更新都会发布到数据库。您可以在事务中保留只读方法,但在更新实体时,这些方法不是只读的。如果您不想更新数据库中的实体,那么将这些更新保持在EJB方法之外。谢谢,DAO类是从无状态会话bean调用的,并且在任何地方都没有更新指令或开始事务。UserEntity user=em.find(UserEnt.class,userid);告诉我它正在事务中运行它必须在事务中运行,因为我使用@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
设置了方法,如您所示,并且该行不再更新。使用find
意味着您启动了一个事务?我只需要加载行。因此,每当我使用只读方法(即加载记录时不需要更新)时,我需要显式地向容器指示不要启动事务?EJB将把您的实体视为数据库行,事务中对实体的任何更新都会发布到数据库。您可以在事务中保留只读方法,但在更新实体时,这些方法不是只读的。如果您不想更新数据库中的实体,那么将这些更新放在EJB方法之外。