I tried to create a one-to-one mapping and save the SQL db using hibernate, but I am running my project. I get the following error:
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
There is my mapped class:
@Entity @Table(name = "Complaint", catalog = "jobcard") public class Complaint implements Serializable{ private Integer complaint_id; private String nature; private String instruction; private JobDone jobDone; @Id @GeneratedValue(strategy = IDENTITY) @Column(name = "complaint_id", unique = true, nullable = false) public Integer getComplaint_id() { return complaint_id; } public void setComplaint_id(Integer complaint_id) { this.complaint_id = complaint_id; } public String getNature() { return nature; } public void setNature(String nature) { this.nature = nature; } public String getInstruction() { return instruction; } public void setInstruction(String instruction) { this.instruction = instruction; } @OneToOne(fetch = FetchType.LAZY, mappedBy = "jobDone", cascade = CascadeType.ALL) public JobDone getJobDone() { return jobDone; } public void setJobDone(JobDone jobDone) { this.jobDone = jobDone; } }
another class:
@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; @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; } public void setJobDone_id(Integer jobDone_id) { this.jobDone_id = jobDone_id; } public String getNature() { return nature; } public void setNature(String nature) { this.nature = nature; } public Integer getAmount() { return amount; } public void setAmount(Integer amount) { this.amount = amount; } @OneToOne(fetch = FetchType.LAZY) @PrimaryKeyJoinColumn public Complaint getComplaint() { return complaint; } public void setComplaint(Complaint complaint) { this.complaint = complaint; } }
SQL query:
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 );
And I create a hibernate.cfg.xml file and I matched the fully qualified class name of both classes. why am I getting this error.
Update
Works
Complaint Class:
@OneToOne(fetch = FetchType.LAZY) @PrimaryKeyJoinColumn public JobDone getJobDone() { return jobDone; }
JobDone Class:
@OneToOne(fetch = FetchType.LAZY, mappedBy = "jobDone", cascade = CascadeType.ALL) public Complaint getComplaint() { return complaint; }