EJB 实体:数据库行自动从实体更新而不保存在 EJB 中
EJB Entity: database row is automatically updated from Entity without save in EJB
该方法从数据库加载用户实体 bean 并 returns 它,但在此之前清除密码(将其设置为 null)。问题是在数据库本身中密码设置为 null,即使我没有 merge
或任何其他更新实体的方法。有什么想法吗?
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
,因此您的实体 attached
并在事务关闭时被保存。
您的 DAO 或服务层在 class 级别标记了事务,因此该方法在事务中。
如果您的方法是事务的一部分,那么它基本上是在事务的开始和结束时添加以下内容,并将更新提交给事务中的所有实体。
entityManager.getTransaction().begin();
// updates to entity
entityManager.getTransaction().commit(); //Saves all updates to DB
您可以通过在视图层中的事务之外进行更新或将该方法标记为不属于事务的一部分来避免它。
通过添加
将您的方法标记为不属于交易的一部分
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
该方法从数据库加载用户实体 bean 并 returns 它,但在此之前清除密码(将其设置为 null)。问题是在数据库本身中密码设置为 null,即使我没有 merge
或任何其他更新实体的方法。有什么想法吗?
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
,因此您的实体 attached
并在事务关闭时被保存。
您的 DAO 或服务层在 class 级别标记了事务,因此该方法在事务中。
如果您的方法是事务的一部分,那么它基本上是在事务的开始和结束时添加以下内容,并将更新提交给事务中的所有实体。
entityManager.getTransaction().begin();
// updates to entity
entityManager.getTransaction().commit(); //Saves all updates to DB
您可以通过在视图层中的事务之外进行更新或将该方法标记为不属于事务的一部分来避免它。
通过添加
将您的方法标记为不属于交易的一部分@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)