Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

org.hibernate.AnnotationException: Unknown mappedBy in: mdl.Complaint.jobDone, referenced property unknown: mdl.JobDone.jobDone

Tags:

java

hibernate

I tried create one-to-one mapping and save SQL db using hibernate,but I run my project I am getting 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;

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

}

other 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;

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

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 hibernate.cfg.xml file and I mapped fully qualified class name both classes. why I am getting this error.

Update

It's work

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;
}
like image 740
AsankaD7 Avatar asked Feb 26 '16 07:02

AsankaD7


1 Answers

The problem, obviously, is that you don't have a property jobDone in the JobDone. You can use this mapping

public class Compilant {

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

}

You will have a foreign key in the Complaint to the JobDone. And you can delete Compilant property from JobDone.

If you want to have an association in the JobDone to the Complaint too (which is not very convenient)

public class JobDone {

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

}     

If you want to have a foreign key only in the 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;
    }

}
like image 191
v.ladynev Avatar answered Oct 30 '22 13:10

v.ladynev