我已经搜索了一段时间,但没有找到我正在尝试做的示例。
我们有一个将被大量使用的 API。其中一项操作是创建一个新的Client
域对象。每个人的名字Client
都是独一无二的。
在以下代码中,我们按名称读取客户端。如果它不存在,我们尝试创建它。由于 2 个线程可能试图同时创建同一个客户端,我们捕获一个ConstraintException
然后进行另一个查找,以防另一个线程在我们之前进入:
@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, isolation = Isolation.READ_COMMITTED)
public Client getOrCreate(String name) {
DetachedCriteria query = DetachedCriteria.forClass(Client.class).add(Restrictions.eq("name", name));
Client client = entityDao.findSingle(Client.class, query);
if (client == null) {
client = new Client();
client.setName(name);
try {
entityDao.save(client);
} catch (ConstraintViolationException e) {
client = entityService.findSingle(Client.class, query);
}
}
return client;
}
Hibernate 抱怨这段代码,因为在异常中我们试图使用一个涉及异常的会话:
org.hibernate.AssertionFailure: null id in com.mydomain.Client entry (don't flush the Session after an exception occurs)
是否有标准模式或方法来完成我在 Hibernate 中尝试做的事情?