3

@OneToManyを別のエンティティ(CoverArt)にマッピングするエンティティクラス(Song)を用意し、メインエンティティを保存してカバーアートの永続化を処理する方が簡単なように見えるため、カスケードをALLに設定します。

@Audited
@Entity
public class Song
{
    @Id
    @GeneratedValue
    private Integer recNo;

    @Version
    private int version;

    @OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
    private List<CoverArt> coverArts;

    ....

}

しかし、コードの後半で、データベースからクラスのインスタンスを取得し、セッション内でSongエンティティの1つのフィールドだけを変更すると、その曲にリンクされているすべてのカバーアートエンティティが更新されることがわかりました。カバーアートは何も変わっていませんが、なぜこれをしているのですか?

また、それが問題を引き起こすとは思わないが、私はEnversを使用しており、CoverArtテーブルへの(一見)不必要な追加の更新は、Enversに不要な監査テーブルを作成させるというノック効果もあります。

1つのフィールドを変更するCascadeTypeアノテーションを削除しても、カバーアートエンティティは更新されず、カバーアートを追加するときに追加のロジックを追加する限り、すべてが正常に機能しますが、必要がないことを望んでいました。これ。

4

2 に答える 2

1

新しいセッションを作成し、既存のセッションのメソッドを渡してセッションを終了するのではなく、DBから何かを取得するたびにセッションを閉じるというアンチパターンを使用していた問題を修正したようです。オブジェクト、これを修正すると問題が修正されました。

于 2012-03-08T11:04:15.283 に答える
1

自分のアプリケーションに正確な問題があります。カスケード={CascadeType.ALL}の1対多が3つあります

誰かが適切なセッションの再利用で機能する例を教えてもらえますか?私のコード:

public class HibernateUtil {

private static final SessionFactory sessionFactory = buildSessionFactory();

private static SessionFactory buildSessionFactory() {
    try {
        // Create the SessionFactory from hibernate.cfg.xml
        Configuration conf = new Configuration().configure();
        ServiceRegistry sr = new StandardServiceRegistryBuilder().applySettings(conf.getProperties()).build();
        SessionFactory sf = conf.buildSessionFactory(sr);
        return sf;   
    }
    catch (HibernateException ex) {
        // Make sure you log the exception, as it might be swallowed
        System.err.println("Initial SessionFactory creation failed." + ex);
        throw new ExceptionInInitializerError(ex);
    }
}

public static SessionFactory getSessionFactory() {
    return sessionFactory;
}

}


public groupelti.lims.persistence.vo.LotEchantillonRegulier modifier(groupelti.lims.persistence.vo.LotEchantillonRegulier ler) throws DAOException {

    // validation
    if (ler == null) {
        throw new IllegalArgumentException();
    }
    if (ler.getId() == null) {
        throw new IllegalArgumentException();
    }
    if (ler.getId() <= 0) {
        throw new IllegalArgumentException();
    }

    // traitement
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();

    try {
        session.update(ler);
        session.getTransaction().commit();
    } catch (PropertyValueException e) {
        logger.info("" + e.getMessage());

        session.getTransaction().rollback();
        throw new DAOException("Voir log.", e);
    } catch (ConstraintViolationException e) {
        logger.info("" + e.getMessage());

        session.getTransaction().rollback();
        throw new DAOException("Voir log.", e);
    } catch (GenericJDBCException e) {
        logger.info("" + e.getMessage());

        session.getTransaction().rollback();
        throw new DAOException("Voir log.", e);
    } catch (TransientObjectException e) {
        logger.info("" + e.getMessage());

        session.getTransaction().rollback();
        throw new DAOException("Voir log.", e);
    } finally {
        try {
            session.close();
        } catch (SessionException e) {
            //do nothing
        }
    }

    return ler;
}

連絡先genest@gmail.comよろしく、マシュー

于 2015-05-14T13:47:51.517 に答える