2015-03-13 31 views
1

该方法从数据库加载用户实体bean并将其返回,但在执行之前清除密码(将其设置为空)。问题在于,在数据库本身中,密码设置为空,即使我没有merge或任何其他更新实体的方法。有任何想法吗?EJB实体:数据库行自动从实体更新而不保存在EJB中

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

回答

4

好像方法loadFromDB在事务中调用,所以你的实体是attached当交易被关闭得到保存。

您的DAO或服务层具有在类级别标记的事务,因此该方法位于事务中。

如果你的方法是事务的一部分,那么它基本上是在事务的开始和结束时添加下面,它将更新事务中的所有实体。

entityManager.getTransaction().begin(); 

// updates to entity 

entityManager.getTransaction().commit(); //Saves all updates to DB 

你可以做你的交易之外的更新您的视图层或标志着方法不是交易的一部分,避免它。

标记您的方法不是通过增加

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 
+0

感谢transcation的一部分,DAO类是从一个无状态会话bean调用,有没有更新的指令或任何地方开始交易。 – ps0604 2015-03-13 15:08:35

+0

UserEntity user = em.find(UserEnt.class,userid);告诉我它正在事务中运行 – 2015-03-13 15:16:32

+0

它必须在事务中运行,因为我按照您的指示使用'@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)'设置方法,并且行不再更新。使用'find'意味着你启动一个事务?我只需要加载该行。 – ps0604 2015-03-13 15:18:02