Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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 JPA-只有当方法为@Transactional时,才会更新数据库_Java_Hibernate_Jpa_Entitymanager - Fatal编程技术网

Java JPA-只有当方法为@Transactional时,才会更新数据库

Java JPA-只有当方法为@Transactional时,才会更新数据库,java,hibernate,jpa,entitymanager,Java,Hibernate,Jpa,Entitymanager,我遇到了一个我不太理解的问题——除非使用DAO的方法被注释为@Transactional,否则底层数据库不会得到更新。我的应用程序运行在JPA/Hibernate、Spring和Wicket上。为什么呢 道: 服务: @Service(value = "userManager") public class UserManagerImpl implements UserManager { @Autowired UserDao dao; public void setUse

我遇到了一个我不太理解的问题——除非使用DAO的方法被注释为@Transactional,否则底层数据库不会得到更新。我的应用程序运行在JPA/Hibernate、Spring和Wicket上。为什么呢

道:

服务:

@Service(value = "userManager")
public class UserManagerImpl implements UserManager {
    @Autowired
    UserDao dao;

    public void setUserDao(UserDao dao) {
        this.dao = dao;
    }

    public List getUsers() {
        return dao.findAll();
    }

    public User getUser(String userId) {
        return dao.findById(Long.valueOf(userId));
    }

    public void saveUser(User user) {
        dao.update(user);
    }

    @Transactional
    public void removeUser(User user) {
        dao.delete(user);
    }
}

如果我遗漏了@Transactional注释,数据库不会得到更新。

尝试刷新并提交。

这很正常: CRUD方案中的每个数据库操作都需要它的事务边界。如果没有这些边界,就不会在数据库中实际写入任何内容。 事务是数据库操作(插入、更新)的集合,这些操作必须全部成功,否则整个操作将被数据库撤消。这就是为什么您必须在事务开始和结束时告诉Hibernate,以便Hibernate可以告诉您哪些操作必须作为工作单元。没有事务边界,对数据库的最终提交永远不会发生


希望这有帮助

哦,这是有道理的。那么,通常事务边界是在服务层之上的层上标记的,在这里我将两个服务层调用组合在一起?不,通常您在服务层上应用边界,但是,如果您愿意,您还可以在上面的层上定义一个额外的@transnational,而较低层的事务方法将参与上层事务。检查谷歌的事务隔离的一些例子…第11章的Hibernate文档是一个很好的起点来学习这些东西。
@Service(value = "userManager")
public class UserManagerImpl implements UserManager {
    @Autowired
    UserDao dao;

    public void setUserDao(UserDao dao) {
        this.dao = dao;
    }

    public List getUsers() {
        return dao.findAll();
    }

    public User getUser(String userId) {
        return dao.findById(Long.valueOf(userId));
    }

    public void saveUser(User user) {
        dao.update(user);
    }

    @Transactional
    public void removeUser(User user) {
        dao.delete(user);
    }
}