【发布时间】: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