Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java EJB实体:数据库行从实体自动更新,无需保存在EJB中_Java_Ejb - Fatal编程技术网

Java EJB实体:数据库行从实体自动更新,无需保存在EJB中

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)

该方法从数据库加载一个用户实体bean并返回它,但在执行此操作之前,会清除密码(将其设置为null)。问题是,在数据库本身中,密码设置为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方法之外。