【问题标题】:Mapping @ManyToOne / Foreign Key Hibernate Java映射@ManyToOne /外键休眠Java
【发布时间】:2018-06-12 17:02:03
【问题描述】:

首先,很抱歉,如果该主题已经得到解答,但我已经连续搜索了将近 6 个小时,并尝试了我在网上可以找到的所有内容,但我仍然卡住了..

我在执行代码时遇到问题..我找不到它的起源,也找不到解决方案...

这是我的不同课程:(顺便说一句,这是我在 SOF 上的第一篇文章,如果您需要更多信息,请告诉我)。

我将发布我的 Pojo、有用的 DAO 和 MySQL 表创建命令,以及我收到的错误消息。

POJO:

-名人:

@Entity
@Table(name="Celebrite")
public class Celebrite implements Serializable{

private static final long serialVersionUID = 1L;

@Id
@Column(name="numCelebrite")
@GeneratedValue(strategy=GenerationType.IDENTITY)
@JoinColumn(name="numCelebrite")
private int numCelebrite;

@Column(name="nom")
private String nom;

@Column(name="prenom")
private String prenom;

@Column(name="nationalite")
private String nationalite;

@Column(name="epoque")
private String epoque;

public Celebrite() {
    super();
}

public Celebrite(String nom, String prenom, String nationalite, String epoque) {
    super();
    this.nom = nom;
    this.prenom = prenom;
    this.nationalite = nationalite;
    this.epoque = epoque;
}


public int getNumCelebrite() {
    return numCelebrite;
}

public void setNumCelebrite(int numCelebrite) {
    this.numCelebrite = numCelebrite;
}
//Other getters/setters
}

-纪念碑

@Entity
public class Monument implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private String codeM;
    private String nomM;
    private String proprietaire;
    private String typeMonument;
    private float latitude;
    private float longitude;

    public Monument() {
        super();
    }
    public Monument( String codeM,String nomM, String propritaire, String typeMonument, float latitude, float longitude) {
        super();
        this.codeM=codeM;
        this.nomM = nomM;
        this.proprietaire = propritaire;
        this.typeMonument = typeMonument;
        this.latitude = latitude;
        this.longitude = longitude;
    }

    public Monument( String nomM, String propritaire, String typeMonument, float latitude, float longitude) {
        super();

        this.nomM = nomM;
        this.proprietaire = propritaire;
        this.typeMonument = typeMonument;
        this.latitude = latitude;
        this.longitude = longitude;
    }

    public String getCodeM() {
        return codeM;
    }

    public void setCodeM(String codeM) {
        this.codeM = codeM;
    }

    //other getters/setters..
}

-AssocieA(翻译:AssociatedTo)

@Entity
public class AssocieA  implements Serializable{
    private static final long serialVersionUID = 1L;
     @Id
     @ManyToOne(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
     @JoinColumn(name="numCelebrite",referencedColumnName="numCelebrite")
     private Celebrite celebrite;
     //private int numCelebrite;

     @Id
     @ManyToOne(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
     @JoinColumn(name="codeM",referencedColumnName="codeM")
    //private String codeM;
     private Monument monument;

    public AssocieA() {
    }

        public AssocieA(Celebrite celebrite, Monument monument) {
        super();
        this.celebrite = celebrite;
        this.monument = monument;
    }

//getters/setters
}

好的,现在是 DAO,我只发布 AssocieA 的 DAO,因为其他人工作正常

public class DAOAssocieA {
    EntityManagerFactory emf;
    EntityManager em ;

    public DAOAssocieA() {
        super();
        this.emf = Persistence.createEntityManagerFactory("jpa-societe-pu");
        this.em = emf.createEntityManager();
    }

    public List<AssocieA> getAssociatedMonuments(int numCelebrite){
        Query req=em.createQuery("Select a from AssocieA a where a.numCelebrite =" + numCelebrite);
        return  req.getResultList();
    }

    public List<AssocieA> getAssociatedCelebrities(String codeM){
        Query req=em.createQuery("Select a from AssocieA a where a.codeM = '"+codeM+"'");
        return req.getResultList();
    }
}

最后是“主”类

public String execute() {
        setDAOc(new DAOCelebrite());
        setDAOm(new DAOMonument());
        setDAOa(new DAOAssocieA());
        if (getNom()==null)
            setNom("");
        if (getPrenom() == null)
            setPrenom("");
        if (getNationalite() == null)
            setNationalite("");
        if (getEpoque()==null)
            setEpoque(""); 
        setListeCelebrite(DAOc.getCelebritiesBy(getNom(),getPrenom(),getNationalite(), getEpoque()));
        System.out.println(getAssociated());
        if (getAssociated().equals("on")) {
            for (Celebrite c:listeCelebrite) {
                for (AssocieA a : DAOa.getAssociatedMonuments(c.getNumCelebrite())){
                    System.out.println(a.getCelebrite());
                    System.out.println(a.getMonument());
                }  
            }
        }  

        return ("success");

-> 返回(“成功”)是因为我使用的是 Struts2

现在,表创建命令(在 MySQL 上)

CREATE TABLE Celebrite (numCelebrite int auto_increment, nom varchar(16), prenom varchar(16), nationalite varchar(10), epoque varchar(6), PRIMARY KEY (numCelebrite)) ENGINE=InnoDB;

CREATE TABLE Monument (codeM varchar(5), nomM varchar(25), proprietaire varchar(10), typeMonument varchar(16), longitude float, latitude float, PRIMARY KEY (codeM)) ENGINE=InnoDB;

CREATE TABLE AssocieA (codeM varchar(5), numCelebrite int, PRIMARY KEY (codeM,numCelebrite), FOREIGN KEY (codeM) REFERENCES Monument(codeM), FOREIGN KEY (numCelebrite) REFERENCES Celebrite(numCelebrite)) ENGINE=InnoDB;

最后,我得到的错误信息:

 org.hibernate.QueryException: could not resolve property: numCelebrite of: pojo.AssocieA [Select a from pojo.AssocieA a where a.numCelebrite =1]

我知道“AssocieA”类没有“numCelebrite”属性,但我认为由于 @ManyToOne 注释,应该在加载 Associe 时加载 Celebrite Table。

否则,您能否给我一些提示来解释如何做到这一点? 最终目标是:拥有一个名人,我想使用 numCelebrite,使用 AssocieA 表检索与其相关的每个纪念碑。

提前谢谢你

编辑:kulturman 在另一个网站上找到的解决方案: 我使用的是原生查询:

em.createQuery("from AssocieA a where a.numCelebrite  =" + numCelebrite);

代替 JPQL(HQL 查询):

em.createQuery("from AssocieA a where a.celebrite.numCelebrite  =" + numCelebrite);

对于那些想直接查看解决方案的人,OpenClassRoom 上有法语版

【问题讨论】:

    标签: java mysql hibernate foreign-keys mapping


    【解决方案1】:

    尝试删除名人 pojo 中的 @JoinColumn(name="numCelebrite")@GeneratedValue(strategy=GenerationType.IDENTITY),将 CascadeType.ALL 更改为 CascadeType.Persist,然后告诉我们会发生什么。我不是专家,但我认为你可以做到这一点。

    【讨论】:

    • 很抱歉,它没有改变任何东西:/
    • @Nox 你能发布你的数据库结构吗?还有其他错误吗?也许您应该从堆栈跟踪中发布一些其他行。
    • 嘿。谢谢你的帮助。我编辑了我的第一篇文章,因为有人在另一个论坛上找到了我的问题的答案。也许我应该让这一点更明显.. 除此之外,我非常感谢您抽出时间帮助人们!
    • @Nox 不客气!我们是来学习和帮助的,你能给我其他帖子的链接以查看解决方案,这样我也可以学习。提前致谢。
    • 查看我之前的编辑,我显然忘记将链接放在帖子的末尾。对于这个错误,我感到非常抱歉。我将对我的帖子进行回复以明确答案
    【解决方案2】:

    kulturman 在另一个网站上找到的解决方案:

    我不得不更换:

    em.createQuery("from AssocieA a where a.numCelebrite  =" + numCelebrite);
    Instead of JPQL (HQL queries):
    

    作者:

    em.createQuery("from AssocieA a where a.celebrite.numCelebrite  =" + numCelebrite);
    

    解释如下:

    我正在构建我的查询,就好像我在请求我的数据库一样: 表 AssocieA 具有属性“numCelebrite”

    但就我而言,我将表映射到我的类:AssocieA 表的每一行现在都是我的 AssocieA 类的一个实例。 使用 HQL 查询,我请求的是我的类的实例,而不是我的数据库表。 所以我要做的是a.getCelebrite().getNumCelebrite(),因此是“a.celebrite.numCelebrite”

    我希望我已经说得够清楚了,因为我的英语不是很好。

    这是我有这个答案的论坛的链接(它是法语): https://openclassrooms.com/forum/sujet/org-hibernate-queryexception?page=1#message-92165885

    【讨论】:

      猜你喜欢
      • 2021-02-02
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 1970-01-01
      • 2020-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多