日食JPA一对一关系
我正试图用EclipseLink JPA和MySQL建立一个简单的一对一关系模型。它失败并显示一些错误消息。有人能帮我理解它遗漏了什么吗日食JPA一对一关系,jpa,eclipselink,Jpa,Eclipselink,我正试图用EclipseLink JPA和MySQL建立一个简单的一对一关系模型。它失败并显示一些错误消息。有人能帮我理解它遗漏了什么吗 @Entity public class Job implements Serializable { @Id @GeneratedValue private long jobId; @OneToMany(targetEntity=Applicant.class,mappedBy="job",cascade=CascadeTyp
@Entity
public class Job implements Serializable {
@Id
@GeneratedValue
private long jobId;
@OneToMany(targetEntity=Applicant.class,mappedBy="job",cascade=CascadeType.ALL)
private List<Applicant> applicant;
//Gettters and Setters
}
@Entity
public class Applicant {
@Id
@GeneratedValue
private long applicantId;
@ManyToOne
@JoinColumn(name="job_Id")
private Job job;
//Gettters and Setters
}
您需要在
申请人
表中有一个外键列
您已经用@JoinColumn(name=“Job\u Id”)
注释了与作业的关系@JoinColumn
是不必要的,因为JPA完全是约定优先于配置的,这意味着如果您不重写默认值,就会隐含默认值。如果没有此注释,EclipseLink将搜索名为job\u jobId
(\u
)的列。因为您声明了join列是job\u Id
,所以您需要在applicator
表中设置该列
以下是应与实体映射(使用@JoinColumn(name=“job\u Id”)
)一起使用的数据库表:
@实体
公共类作业实现可序列化{
@身份证
@生成值
@列(name=“job\u id”)
私人长期工单;
@OneToMany(mappedBy=“job”,cascade=CascadeType.ALL)
私人名单申请人;
公职(){
申请人=新ArrayList();
}
公开名单申请者(){
//通过addapplicator()方法强制客户端封装关系双方的设置
退货托收。不可修改列表(申请人);
}
公共申请者(申请人){
//确定关系的双方
申请人。setJob(本);
申请人。添加(申请人);
}
}
@实体
公开课申请人{
@身份证
@生成值
私人长期申请;
@许多酮
@JoinColumn(name=“job\u Id”)
私人工作;
}
作业=新作业();
申请人=新申请人();
职位。添加申请人(申请人);
em.persist(job);
您是否在表申请人
中有job\u Id
列?我听说它不是必需的,我们可以提供任何名称。我删除了@join列。这里有一条新的错误消息:无法添加或更新子行:外键约束失败(mydb
applicator
,CONSTRAINTFK\u applicationId
外键(applicationId
)引用job
(JOBID
)生成的SQL:INSERT INTO job(JOBID)值(?)bind=>[2401]INSERT INTO applicationer(applicationId,job\u JOBID)值(?),bind=>[2402,null]为什么在第二次插入中未填充JOB_JOBID?您需要将申请人.setJob(JOB)
添加到代码中。
Job job=new Job ();
List <Applicant> applicants=new ArrayList<Applicant>();
Applicant applicant=new Applicant();
applicants.add(applicant);
job.setApplicant(applicants);
em.persist(job);// EntityManager Reff
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'job_Id' in 'field list'
TABLE JOB
JOBID (PRIMARY KEY)
TABLE APPLICANT
APPLICANTID (PRIMARY KEY)
JOB_ID (FOREIGN KEY TO JOB#JOBID)
@Entity
public class Job implements Serializable{
@Id
@GeneratedValue
@Column(name="job_id")
private long jobId;
@OneToMany(mappedBy="job",cascade=CascadeType.ALL)
private List<Applicant> applicants;
public Job(){
applicants = new ArrayList<Applicant>();
}
public List<Applicant> getApplicants(){
//force clients through addApplicant() method to encapsulate setting both sides of relationship
return Collections.unmodifiableList(applicants);
}
public void addApplicant(Applicant applicant){
//set both sides of relationship
applicant.setJob(this);
applicants.add(applicant);
}
}
@Entity
public class Applicant {
@Id
@GeneratedValue
private long applicantId;
@ManyToOne
@JoinColumn(name="job_Id")
private Job job;
}
Job job = new Job ();
Applicant applicant = new Applicant();
job.addApplicant(applicant);
em.persist(job);