Я пытаюсь заменить триггер на 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, его советы приветствуются, у меня нет идей.