@EntityListeners с PostPersist, объединение, которое не работает - PullRequest
0 голосов
/ 08 января 2020

Я пытаюсь заменить триггер на EntityListeners. При добавлении этой статьи в список упорядоченных статей этот элемент должен обновляться.

Мои функции CRUD и, таким образом, раздел является дополнением к упорядоченному элементу списка, но элемент не подходит stock.

Мой модульный тест, который добавляет элемент в список элементов

public void test1_insertArticlesCommande() {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistence");
    EntityManager em = emf.createEntityManager();
    Client client = em.find(Client.class, 3);
    Article article = em.find(Article.class, 8);
    Controler contr = Controler.getInstance();
    contr.addCommande("2019-10-16", false, 0.00, false, client);//date, cloturée, montant, anullée, idClient
    Commande commande = em.find(Commande.class, 10);
    contr.addArticleCommande(article, commande, 2, 2.65);//idArticle, idCommande, QtyArticle, prixArticle
    System.out.println("TEST1 - articleCommande ajouté dans la DB.");
}

Мой контроллер и его метод addArticleCommand ()

public void addArticleCommande(Article idArticle, Commande idCommande, int qtyArticle, double prixArticle) { 
    ArticleCommande articleCommande = new ArticleCommande(idArticle, idCommande, qtyArticle, prixArticle);
    IntDAO createArticleCommande = DAOFactory.getDAO("ArticleCommandeDAO");
    createArticleCommande.create(articleCommande);
}

метод создания Мой класс OrderDAO:

@Override
public void create(Object entity) {
    ArticleCommande articleCommande = (ArticleCommande) entity;
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistence");//création EntityManagerFactory.
    EntityManager em = emf.createEntityManager();
    Boolean statusArticle = articleCommande.getIdArticle().status;
    Boolean CommandeCloture = articleCommande.getIdCommande().getCommandeCloturee();
    em.getTransaction().begin();
    try {
        if (statusArticle == false) {//Si un article sélectionné est inactif
            JOptionPane.showMessageDialog(null, "Impossible d'ajouter un article qui n'est plus actif.", "Erreur", JOptionPane.ERROR_MESSAGE);
        } else {

        }
        if (CommandeCloture == true) {//Si on essaye d'ajouter un article à une commande cloturée
            JOptionPane.showMessageDialog(null, "Impossible d'ajouter un article à une commande cloturée.", "Erreur", JOptionPane.ERROR_MESSAGE);
        } else {

        }
        if (articleCommande.getQtyArticleCommande() > articleCommande.getIdArticle().getStockArticle()) {//Si le stock de l'article sélectionné n'est pas suffisant
            JOptionPane.showMessageDialog(null, "Quantité d'article en stock insufisante.", "Erreur", JOptionPane.ERROR_MESSAGE);
        } else {

        }
        if (statusArticle == true && CommandeCloture == false && articleCommande.getQtyArticleCommande() <= articleCommande.getIdArticle().getStockArticle()) {
            em.persist(articleCommande);
            em.getTransaction().commit();
        }
    } catch (Exception ex) {
        em.getTransaction().rollback();
        JOptionPane.showMessageDialog(null, ex, "Message d'erreur", JOptionPane.ERROR_MESSAGE);
    } finally {
        em.close();
    }
}

мой класс ArticleCommande с @EntityListeners (ArticleOrderListener.class)

@EntityListeners(ArticleCommandeListener.class)//Listener pour adaptation du stock
@Entity
@Table(name = "articles_commandes")
@NamedQueries({
@NamedQuery(name = "ArticleCommande.findByIdCommande", query = "SELECT ac FROM ArticleCommande ac WHERE ac.idCommande.idCommande = :id")
})
public class ArticleCommande implements Serializable{

    private static final long serialVersionUID = 5L;

    /**
    * Atrributs
    */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "PK_id_articles_commandes", columnDefinition = "INT(10) UNSIGNED")
    private int idArticleCommande;
    @Column(name = "qty_article_commande", nullable = false, columnDefinition = "INT(10) UNSIGNED")
    private int qtyArticleCommande;
    @Column(name = "prix_actuel_article_commande", nullable = false)
    private Double PrixActuelArticleCommande;

    @ManyToOne
    @JoinColumn(name = "FK_Articles_id_articles", referencedColumnName = "PK_id_articles")
    private Article article;
    @ManyToOne
    @JoinColumn(name = "FK_Commandes_id_commandes", referencedColumnName = "PK_id_commandes")
    private Commande idCommande;

    /**
     * Constructeur par defaut
    */
    public ArticleCommande() {
    }

    /**
     * Constructeur
     * @param idArticleCommande
     * @param qty
     * @param prix 
     */
    public ArticleCommande(int idArticleCommande, int qty, double prix, Article article) {
        this.idArticleCommande = idArticleCommande;
        this.qtyArticleCommande = qty;
        this.PrixActuelArticleCommande = prix;
        this.article = article;
    }

    /**
     * Constructeur
     * @param qtyArticleCommande
     * @param prix
     * @param idArticle
     * @param idCommande 
     */
    public ArticleCommande(Article idArticle, Commande idCommande, int qtyArticleCommande, Double prix) {
        this.article = idArticle;
        this.idCommande = idCommande;
        this.qtyArticleCommande = qtyArticleCommande;
        this.PrixActuelArticleCommande = prix;
    }

    /**
     * Constructeur
     * @param id
     * @param idArticle
     * @param idCommande
     * @param qtyArticleCommande
     * @param prix
     */
    public ArticleCommande(int id, Article idArticle, Commande idCommande, int qtyArticleCommande, Double prix) {
        this.idArticleCommande = id;
        this.article = idArticle;
        this.idCommande = idCommande;
        this.qtyArticleCommande = qtyArticleCommande;
        this.PrixActuelArticleCommande = prix;
    }

    /**
     * Constructeur
     * @param id 
     */
    public ArticleCommande(int id) {
        this.idArticleCommande = id;
    }

    /**
     * Accesseurs
     * @return 
     */
    public int getIdArticleCommande() {
        return idArticleCommande;
    }

    public void setIdArticleCommande(int idArticleCmmande) {
        this.idArticleCommande = idArticleCmmande;
    }

    public int getQtyArticleCommande() {
        return qtyArticleCommande;
    }

    public void setQtyArticleCommande(int qtyArticleCommande) {
        this.qtyArticleCommande = qtyArticleCommande;
    }

    public Double getPrixActuelArticleCommande() {
        return PrixActuelArticleCommande;
    }

    public void setPrixActuelArticleCommande(Double PrixActuelArticleCommande) {
        this.PrixActuelArticleCommande = PrixActuelArticleCommande;
    }

    public Article getIdArticle() {
        return article;
    }

    public void setIdArticle(Article idArticle) {
        this.article = idArticle;
    }

    public Commande getIdCommande() {
        return idCommande;
    }

    public void setIdCommande(Commande idCommande) {
        this.idCommande = idCommande;
    }

}

Мой класс ArticleCommandeListener

class ArticleCommandeListener {

    @PostPersist
    public void addArticle(ArticleCommande articleCommande) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistence");//création EntityManagerFactory.
        EntityManager em = emf.createEntityManager();
        Article article = new Article();//création d'un nouvel article
        article = articleCommande.getIdArticle();//faire correspondre nouvel article avec l'article qui est dans articleCommande
        System.out.println("article id:" + article.getIdArticle());
        System.out.println(article.getStockArticle());
        article.setStockArticle(article.getStockArticle() - articleCommande.getQtyArticleCommande());
        System.out.println(article.getStockArticle());
        //em.getTransaction().begin();

        try {
            /*em.createQuery("update Article a set a.stockArticle = :newStock where a.idArticle = :id")
                .setParameter("newStock", article.getStockArticle())
                .setParameter("id", article.getIdArticle())
                .executeUpdate();*/
            em.merge(article);
            //em.getTransaction().commit();
        } catch (Exception e) {
            //em.getTransaction().rollback();
        } finally {
            em.close();
        }
    }
}

В последнем я проверьте идентификатор статьи, которая передается в список articleOrder, и я проверяю запас до и после article.setStockArticle. в этот момент акция хорошо адаптируется.

Похоже на em.merge (статья); не работает.

Если кто-то привык использовать Hibernate, его советы приветствуются, у меня нет идей.

...