Question

Avoir un cours d'entité (chanson) avec une cartographie @onetomany vers une autre entité (CoverArt), et Cascade s'est réglé pour tous car il semblait plus facile d'avoir à sauver le principal et de le laisser prendre soin de persister l'art de la couverture

@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;

    ....

}

Mais j'ai trouvé à un moment ultérieur du code si je viens de récupérer et l'instance de la classe à partir de la base de données, puis dans la session modifiée, un seul champ de l'entité de la chanson qui le ferait mettre à jour toutes les entités d'art de couverture liées à cette chanson même Bien que rien n'ait changé pour la couverture, pourquoi fait-il cela?

De plus, je ne pense pas que cela cause le problème, mais j'utilise des envers et les mises à jour supplémentaires inutiles (apparemment) inutiles de la table Coverart ont également l'effet de coups d'effet pour créer des tables d'audit inutiles.

Si je supprime l'annotation en cascadetype modifiant le champ One ne fait pas mettre à jour les entités de couverture et tout fonctionne bien tant que j'ajoute la logique supplémentaire quand j'ajoute une couverture, mais j'espérais que je n'avais pas besoin de faire cette.

Était-ce utile?

La solution

J'ai semblé avoir résolu le problème que j'utilisais l'anti-motif de la création d'une nouvelle session, puis de la fermer chaque fois que je récupérais quoi que Objet, la correction de cela a résolu le problème.

Autres conseils

J'ai le problème exact avec ma propre application. J'en ai 3 à beaucoup avec Cascade = {CascadeType.all}

Quelqu'un peut-il me donner un exemple qui fonctionne avec une réutilisation appropriée de session. Mon code:

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;
}

Contactez genest@gmail.com Cordialement, Mathieu

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top