0

私は 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;

国が null のエンティティを保存してから、国が null でない 2 番目のエンティティを保存しようとすると、2 番目の保存で、国フィールドが null であると不平を言う 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;
}

2回目の呼び出しでも例外がスローされる理由と、2回目の呼び出しでそれを修正する方法を知っている人はいますか?

4

1 に答える 1

1

私はまったく同じ問題を抱えていました。最初の例外が発生した後、後続のすべての JPA クエリの結果で同じ例外が発生します。イベントの単純な選択クエリ。

問題は、トランザクション間でエンティティ マネージャーを閉じないことです。

ブロックを呼び出すことentityManager.clear()で解決しました。catch (PersistenceException e)それが正しいアプローチかどうかはわかりません。

編集:さらに良いことに、clear()呼び出しをfinallyブロックに移動します。そうしないと、メモリ リークが発生する可能性があります。

その間、別の解決策を見つけましたか?

于 2013-01-28T12:12:33.217 に答える