java - Hibernate - 子级错误不会回滚父级插入数据库

标签 java spring hibernate hibernate-mapping

好的,我在用户和帐户之间建立了一对多的关系,在帐户和帐户详细信息之间建立了一对一的关系。当在 account_details 级别插入用户期间发生错误时,不会插入帐户,但会插入用户的记录。同样,如果错误发生在帐户级别,则会插入用户帐户。 EntityManager 应该处理事务的回滚,但事实并非如此。 奇怪的是,当我更新用户帐户并向其添加帐户时,添加帐户级别的失败会回滚对用户模型的所有更新。

持久性 xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
version="1.0">
<persistence-unit name="userPersistenceUnit" transaction-type="RESOURCE_LOCAL" >
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <class>com.urbanbuz.model.User</class>
    <class>com.urbanbuz.model.Account</class>
    <class>com.urbanbuz.model.AccountDetails</class>
</persistence-unit>
</persistence> 

用户DAO:

@Repository("userDao")
@Transactional(propagation = Propagation.REQUIRED)
public class UserDAO {
@PersistenceContext
private EntityManager entityManager;

public EntityManager getEntityManager() {
    return entityManager;
}

public void setEntityManager(EntityManager entityManager) {
    this.entityManager = entityManager;
}

public void insert(User user) {
    entityManager.persist(user);
}

public void update(User user) {
    entityManager.merge(user);
}
}

调用插入用户方法:

@Service
public class UserService {
private UserDAO userDAO;

public UserDAO getUserDao() {
    return userDAO;
}

@Autowired
public void setUserDao(UserDAO userDAO) {
    this.userDAO = userDAO;
}

// summary of method, much code was omitted 
public boolean addUser(User user) {
    // add new user and user accounts
    Set<Account> accounts = new HashSet<Account>();

    Account a = new Account();  
    a.setUser(user);

    AccountDetails ad = new AccountDetails();
    ad.setAccount(a);

    a.setAccountDetails(ad);

    accounts.add(a);

    user.setAccount(accounts);

    try {
        getUserDao().insert(user);
    }
    catch(Exception e) {
    }
}
}

关系定义如下:

在用户模型级别:

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy="user")
private Set<Account> accounts;  

在帐户模型级别:

@ManyToOne
@JoinColumn(name = "user_id") 
public User getUser() {  
    return user;  
}  

最佳答案

如果有人遇到同样的问题 - 我将表类型从 MyISAM 更改为支持回滚的 InnoDB。

关于java - Hibernate - 子级错误不会回滚父级插入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27213290/

相关文章:

java - cms实现调查模块

java - 无法将模型对象添加到 "/"中的 jsp View ,但相同的方法正在调用/index

java - 如何修复 hibernate 配置中的 NPE?

spring - 如何将 session ID保存到我的persistenceLogin表中

java - JTA 事务回滚

Java - 如何使在另一个 ExecutorService 中运行的 ExecutorService 在外部 ExecutorService 上调用关闭时不关闭?

java - 在Java中,是否需要Collat​​or来精确匹配utf-8字符串?

java - Spring Boot 使用 @Value 获取 userName 的无效属性值

Java Hibernate Web 应用程序无法使用 MySQL 数据库显示数据

java - Hibernate:c3p0 在 NewProxyConnection.commit() 处抛出 NullPointerException