2016-02-26 22 views
5

Próbowałem utworzyć mapowanie jeden-do-jednego i zapisać SQL db za pomocą hibernacji, ale uruchamiam mój projekt I otrzymuję następujący błąd:org.hibernate.AnnotationException: Nieznany mappedBy w: mdl.Complaint.jobDone, właściwość referencyjna nieznana: mdl.JobDone.jobDone

Initial SessionFactory creation failed.org.hibernate.AnnotationException: Unknown mappedBy in: mdl.Complaint.jobDone, referenced property unknown: mdl.JobDone.jobDone 
Exception in thread "main" java.lang.ExceptionInInitializerError 
    at config.HibernateUtil.buildSessionFactory(HibernateUtil.java:19) 
    at config.HibernateUtil.<clinit>(HibernateUtil.java:8) 
    at application.JD_Comp.main(JD_Comp.java:22) 
Caused by: org.hibernate.AnnotationException: Unknown mappedBy in: mdl.Complaint.jobDone, referenced property unknown: mdl.JobDone.jobDone 
    at org.hibernate.cfg.OneToOneSecondPass.doSecondPass(OneToOneSecondPass.java:159) 
    at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1689) 
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1396) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1829) 
    at config.HibernateUtil.buildSessionFactory(HibernateUtil.java:13) 
    ... 2 more 

jest moja odwzorowane klasa:

@Entity 
@Table(name = "Complaint", catalog = "jobcard") 
public class Complaint implements Serializable{ 
    private Integer complaint_id; 
    private String nature; 
    private String instruction; 
    private JobDone jobDone; 

    /** 
    * @return the complaint_id 
    */ 
    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "complaint_id", unique = true, nullable = false) 
    public Integer getComplaint_id() { 
     return complaint_id; 
    } 

    /** 
    * @param complaint_id the complaint_id to set 
    */ 
    public void setComplaint_id(Integer complaint_id) { 
     this.complaint_id = complaint_id; 
    } 

    /** 
    * @return the nature 
    */ 
    public String getNature() { 
     return nature; 
    } 

    /** 
    * @param nature the nature to set 
    */ 
    public void setNature(String nature) { 
     this.nature = nature; 
    } 

    /** 
    * @return the instruction 
    */ 
    public String getInstruction() { 
     return instruction; 
    } 

    /** 
    * @param instruction the instruction to set 
    */ 
    public void setInstruction(String instruction) { 
     this.instruction = instruction; 
    } 

    /** 
    * @return the jobDone 
    */ 
    @OneToOne(fetch = FetchType.LAZY, mappedBy = "jobDone", cascade = CascadeType.ALL) 
    public JobDone getJobDone() { 
     return jobDone; 
    } 

    /** 
    * @param jobDone the jobDone to set 
    */ 
    public void setJobDone(JobDone jobDone) { 
     this.jobDone = jobDone; 
    } 

} 

inna klasa:

@Entity 
@Table(name = "JobDone", catalog = "jobcard", uniqueConstraints = { 
     @UniqueConstraint(columnNames = "nature"), 
     @UniqueConstraint(columnNames = "amount") }) 
public class JobDone implements Serializable{ 
    private Integer jobDone_id; 
    private String nature; 
    private Integer amount; 
    private Complaint complaint; 

    /** 
    * @return the jobDone_id 
    */ 
    @GenericGenerator(name = "generator", strategy = "foreign", parameters = @Parameter(name = "property", value = "Complaint")) 
    @Id 
    @GeneratedValue(generator = "generator") 
    @Column(name = "jobDone_id", unique = true, nullable = false) 
    public Integer getJobDone_id() { 
     return jobDone_id; 
    } 

    /** 
    * @param jobDone_id the jobDone_id to set 
    */ 
    public void setJobDone_id(Integer jobDone_id) { 
     this.jobDone_id = jobDone_id; 
    } 

    /** 
    * @return the nature 
    */ 
    public String getNature() { 
     return nature; 
    } 

    /** 
    * @param nature the nature to set 
    */ 
    public void setNature(String nature) { 
     this.nature = nature; 
    } 

    /** 
    * @return the amount 
    */ 
    public Integer getAmount() { 
     return amount; 
    } 

    /** 
    * @param amount the amount to set 
    */ 
    public void setAmount(Integer amount) { 
     this.amount = amount; 
    } 

    /** 
    * @return the complaint 
    */ 
    @OneToOne(fetch = FetchType.LAZY) 
    @PrimaryKeyJoinColumn 
    public Complaint getComplaint() { 
     return complaint; 
    } 

    /** 
    * @param complaint the complaint to set 
    */ 
    public void setComplaint(Complaint complaint) { 
     this.complaint = complaint; 
    } 
} 

zapytań SQL:

CREATE DATABASE jobcard; 
USE jobcard; 
CREATE TABLE Complaint(
    jobNumber varchar(100), 
    complaint_id int(10) primary key NOT NULL AUTO_INCREMENT, 
    nature varchar(200), 
    instruction varchar(200), 
    constraint foreign key(jobNumber) references JobCard(jobNumber) 
    on delete cascade on update cascade 
); 

CREATE TABLE JobDone(
    complaint_id int(10), 
    jobDone_id int(10) primary key NOT NULL AUTO_INCREMENT, 
    nature varchar(200), 
    amount int, 
    constraint foreign key(complaint_id) references Complaint(complaint_id) 
    on delete cascade on update cascade  
); 

I utworzyć plik hibernate.cfg.xml i odwzorowany pełną nazwę klasy obu klas. dlaczego otrzymuję ten błąd.

Aktualizacja

To praca

klasa Zażalenie:

@OneToOne(fetch = FetchType.LAZY) 
@PrimaryKeyJoinColumn 
public JobDone getJobDone() { 
    return jobDone; 
} 

klasa JobDone:

@OneToOne(fetch = FetchType.LAZY, mappedBy = "jobDone", cascade = CascadeType.ALL) 
public Complaint getComplaint() { 
    return complaint; 
} 
+0

spróbuj wysłać plik konfiguracyjny xml – Abdelhak

Odpowiedz

0

Problem, oczywiście, jest to, że nie masz właściwość jobDone w JobDone. Można użyć tego odwzorowania

public class Compilant { 

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    public JobDone getJobDone() { 
     return jobDone; 
    } 

} 

Będziesz mieć klucz obcy w Complaint do JobDone. Możesz usunąć właściwość Compilant z JobDone.

Jeśli chcesz mieć stowarzyszenie w JobDone do Complaint też (co nie jest bardzo wygodne)

public class JobDone { 

    @OneToOne(fetch = FetchType.LAZY) 
    public Complaint getComplaint() { 
     return complaint; 
    } 

}  

Jeśli chcesz mieć klucz obcy tylko w JobDone

public class Compilant { 

    @OneToOne(fetch = FetchType.LAZY, mappedBy = "complaint" cascade = CascadeType.ALL) 
    public JobDone getJobDone() { 
     return jobDone; 
    } 

} 

public class JobDone { 

    @OneToOne(fetch = FetchType.LAZY) 
    public Complaint getComplaint() { 
     return complaint; 
    } 

} 
+0

@AankaDJayasinghe Zmień na co? –

+0

@AankaDJayasinghe Serdecznie zapraszam –

0

To dlatego, że używasz jobDone w jednym miejscu (małe j) i JobDone w innym miejscu (stolica J). Popraw to i problem.

+0

To bardzo dziwne założenie :) –