如何让JPA实体经理忘记以前的异常?

时间:2012-11-12 22:49:21

标签: hibernate exception jpa entitymanager many-to-one

我正在使用Hibernate 4.1.0.Final和hibernate-jpa-2.0-api。我遇到了一个问题,即一旦我保存了包含错误的实体,对其他实体的重复保存就会给出与第一个实体报告的错误相同的错误,即使后续实体没有错误也是如此。这是我的实体:

@GenericGenerator(name = "uuid-strategy", strategy = "uuid.hex")
@Entity
@Table(name = "cb_organization", uniqueConstraints = {@UniqueConstraint(columnNames={"organization_id"})})
public class Organization implements Serializable
{

    …
    @ManyToOne(optional = false) 
    @JoinColumn(name = "country_id", nullable = false, updatable = false)
    /* The country the Organization is in */
    private Country country;

如果我尝试保存国家为空的实体,然后保存国家不为空的第二个实体,则第二个保存会抛出ConstraintViolationException,抱怨国家/地区字段为空。

Organization org1 = new Organization();
…
org.setCountry(null);
orgDao.save(org1);      // We expect exception to be thrown, which it is.

Organization org2 = new Organization();
…
orgDao.setCountry(country); // set a valid Country object
orgDao.save(org2);  

这是相关的DAO代码......

@Autowired
private EntityManager entityManager;

@Override
public Organization save(Organization organization)
{
    if(StringUtils.isEmpty(organization.getId()))
    {
        entityManager.persist(organization);
    }
    else 
    {
        organization = entityManager.merge(organization);
    }
    entityManager.flush();

    return organization;
}

任何人都知道为什么第二次调用也会抛出异常以及我如何能够第二次修复它?

1 个答案:

答案 0 :(得分:0)

我有完全相同的问题。在第一个异常发生后,每个后续JPA查询都会产生相同的异常。事件简单选择查询。

问题是我没有在交易之间关闭我的实体经理。

我通过调用entityManager.clear()块中的catch (PersistenceException e)解决了这个问题。我不确定这是不是正确的做法。

编辑:更好的是,将clear()调用移至finally块。否则可能会导致内存泄漏。

在此期间你找到了另一种解决方案吗?