【问题标题】:JPA/Hibernate - Java EE - Unable to find model.Composer with id model.ComposerId@0JPA/Hibernate - Java EE - 无法找到 ID 为 model.ComposerId@0 的 model.Composer
【发布时间】:2015-05-11 15:53:11
【问题描述】:

我正在尝试在我的数据库中保留一个 COMMANDE 对象(对不起,它是法语;))。 我的数据库: 这是我的映射: 作曲家.java:

package model;

import java.io.Serializable;

import javax.persistence.*;

import model.Panier;
import model.Produit;

/**
 * Entity implementation class for Entity: Composer
 *
 */
@Entity
@Table(name="COMPOSER")
@IdClass(ComposerId.class)

public class Composer implements Serializable {

    @Id
    private int idPan;
    @Id
    private int idProd;

    @ManyToOne
    //@PrimaryKeyJoinColumn(name="idPan", referencedColumnName="id")
    @JoinColumn(name="idPan", referencedColumnName="id", insertable = false, updatable = false)
    private Panier panier;

    @ManyToOne
    //@PrimaryKeyJoinColumn(name="idProd", referencedColumnName="id")
    @JoinColumn(name="idProd", referencedColumnName="id" , insertable = false, updatable = false)
    private Produit produit;
    private int nbProdPan;
    private static final long serialVersionUID = 1L;

    public Composer() {
        super();
    }   
    public Panier getPanier() {
        return this.panier;
    }

    public void setPanier(Panier panier) {
        this.panier = panier;
    }   
    public Produit getProduit() {
        return this.produit;
    }

    public void setProduit(Produit produit) {
        this.produit = produit;
    }   
    public int getNbProdPan() {
        return this.nbProdPan;
    }

    public void setNbProdPan(int nbProdPan) {
        this.nbProdPan = nbProdPan;
    }

}

Commande.java

package model;

import java.io.Serializable;

import javax.persistence.*;

/**
 * Entity implementation class for Entity: Commande
 *
 */
@Entity
@Table(name="COMMANDE")

public class Commande implements Serializable {


    @Id
    @GeneratedValue
    private int id;
    private int modLivrCom;
    private static final long serialVersionUID = 1L;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="idPan")
    private Panier panier;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="idUtil")
    private Utilisateur utilisateur;

    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="idAdr")
    private Adresse adresse;

    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="idEtat")
    private Etatcmd etatcmd;

    public Commande() {
        super();
    }   
    public int getId() {
        return this.id;
    }

    public void setId(int id) {
        this.id = id;
    }   
    public int getModLivrCom() {
        return this.modLivrCom;
    }

    public void setModLivrCom(int modLivrCom) {
        this.modLivrCom = modLivrCom;
    }
    public Panier getPanier() {
        return panier;
    }
    public void setPanier(Panier panier) {
        this.panier = panier;
    }
    public Utilisateur getUtilisateur() {
        return utilisateur;
    }
    public void setUtilisateur(Utilisateur utilisateur) {
        this.utilisateur = utilisateur;
    }
    public Adresse getAdresse() {
        return adresse;
    }
    public void setAdresse(Adresse adresse) {
        this.adresse = adresse;
    }
    public Etatcmd getEtatcmd() {
        return etatcmd;
    }
    public void setEtatcmd(Etatcmd etatcmd) {
        this.etatcmd = etatcmd;
    }
}

Panier.java:

package model;

import java.io.Serializable;
import java.util.List;

import javax.persistence.*;

/**
 * Entity implementation class for Entity: Panier
 *
 */
@Entity
@Table(name="PANIER")

public class Panier implements Serializable {


    @Id
    @GeneratedValue
    private int id;
    private float prixTotPan;
    private static final long serialVersionUID = 1L;

    @OneToOne(mappedBy="panier")
    private Commande commande;

    @OneToMany(mappedBy="panier")
    private List<Composer> composers;

    public Panier() {
        super();
    }   
    public int getId() {
        return this.id;
    }

    public void setId(int id) {
        this.id = id;
    }   
    public float getPrixTotPan() {
        return this.prixTotPan;
    }

    public void setPrixTotPan(float prixTotPan) {
        this.prixTotPan = prixTotPan;
    }
    public List<Composer> getComposers() {
        return composers;
    }
    public void setComposers(List<Composer> composers) {
        this.composers = composers;
    }

}

购买.java

Commande laCommande = new Commande();
        if(Integer.parseInt(request.getParameter("idCommande"))==-1){
            Utilisateur utilisateur = UtilisateurDao.find(((Utilisateur)request.getSession().getAttribute("user")).getId());
            laCommande.setAdresse(utilisateur.getAdresse());
        }
        else{
            Enseigne enseigne = EnseigneDao.find(Integer.parseInt(request.getParameter("idLivraison")));
            laCommande.setAdresse(enseigne.getAdresse());
        }
        model.Panier panier = (model.Panier)request.getSession().getAttribute("Panier");
        PanierDao.update(panier);
        Etatcmd etatcmd = EtatcmdDao.find(0);
        laCommande.setEtatcmd(etatcmd);
        laCommande.setModLivrCom(Integer.parseInt(request.getParameter("idCommande")));
        laCommande.setPanier(panier);
        laCommande.setUtilisateur((Utilisateur)request.getSession().getAttribute("user"));
        CommandeDao.create(laCommande);
        RequestDispatcher dispatcher = request.getRequestDispatcher("/jsp/confirmation.jsp");
        dispatcher.forward(request, response);

当我尝试执行这段代码时,没有对象被持久化,我得到这个错误页面:

HTTP Status 500 - Unable to find model.Composer with id model.ComposerId@0

type Exception report

message Unable to find model.Composer with id model.ComposerId@0

description The server encountered an internal error that prevented it from fulfilling this request.

exception

javax.persistence.EntityNotFoundException: Unable to find model.Composer with id model.ComposerId@0
    org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$JpaEntityNotFoundDelegate.handleEntityNotFound(EntityManagerFactoryBuilderImpl.java:183)
    org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:219)
    org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:275)
    org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:151)
    org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1070)
    org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:989)
    org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:716)
    org.hibernate.type.EntityType.resolve(EntityType.java:502)
    org.hibernate.type.EntityType.replace(EntityType.java:366)
    org.hibernate.type.CollectionType.replaceElements(CollectionType.java:549)
    org.hibernate.type.CollectionType.replace(CollectionType.java:690)
    org.hibernate.type.AbstractType.replace(AbstractType.java:178)
    org.hibernate.type.TypeHelper.replaceAssociations(TypeHelper.java:261)
    org.hibernate.event.internal.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:433)
    org.hibernate.event.internal.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:256)
    org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:189)
    org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:85)
    org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:876)
    org.hibernate.internal.SessionImpl.merge(SessionImpl.java:858)
    org.hibernate.internal.SessionImpl.merge(SessionImpl.java:863)
    org.hibernate.jpa.spi.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:1196)
    dao.PanierDao.update(PanierDao.java:44)
    front.Buy.doPost(Buy.java:60)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727)

我能做什么?

【问题讨论】:

    标签: java hibernate jakarta-ee servlets jpa


    【解决方案1】:

    您的Composer.class 有两个用@Id 注释的字段。在 SQL 中,您只能有一个主键。如果这两个字段都应构成您的主键,请考虑使用复合主键,例如参见JPA documentation,其中显示:

    复合主键使用javax.persistence.EmbeddedIdjavax.persistence.IdClass 注释表示。

    【讨论】:

    • 感谢您的快速答复!但是,这就是我所做的(添加一个@IdClass),但它不起作用。我应该删除@id 吗?
    猜你喜欢
    • 1970-01-01
    • 2019-12-15
    • 2014-04-02
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    相关资源
    最近更新 更多