好的,我在用户和帐户之间建立了一对多的关系,在帐户和帐户详细信息之间建立了一对一的关系。当在 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/