2016-02-26 11 views
5

Ho provato a creare il mapping one-to-one e ho salvato SQL db utilizzando hibernate, ma eseguo il mio progetto I che ottiene seguente errore:org.hibernate.AnnotationException: mappato sconosciuto in: mdl.Complaint.jobDone, proprietà di riferimento sconosciuta: 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 

C'è la mia classe mappata:

@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; 
    } 

} 

altra classe:

@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; 
    } 
} 

query 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  
); 

E creo lima hibernate.cfg.xml e ho mappato nome completo della classe entrambe le classi. perché sto ottenendo questo errore

Aggiornamento

E 'un lavoro

classe Reclamo:

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

classe jobdone:

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

prova a postare il file di configurazione xml – Abdelhak

risposta

0

Il problema, ovviamente, è che non si dispone di un proprietà jobDone nello JobDone. È possibile utilizzare questa mappatura

public class Compilant { 

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

} 

Avrete una chiave esterna nella Complaint al JobDone. Ed è possibile eliminare la proprietà Compilant da JobDone.

Se si vuole avere un'associazione nella JobDone al Complaint troppo (che non è molto conveniente)

public class JobDone { 

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

}  

Se si vuole avere una chiave esterna solo nella 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

@AsankaDJayasinghe Cambia in cosa? –

+0

@AsankaDJayasinghe Prego –

0

È perché si sta utilizzando jobDone in un unico luogo (piccola j) e JobDone in altro luogo (maiuscola J). Correggilo e il problema dovrebbe andare.

+0

È un'assunzione molto strana :) –