Hibernate mappedBy =“table_name”令人困惑

时间:2017-08-03 07:04:35

标签: java hibernate naming-conventions

我有两个域模型,如下所示,

@Entity
@Table(name = "candidate") // lowercase-for-database-conventions
public class Candidate {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
.
.
.
@OneToOne(mappedBy="Candidate", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
//above here, mappedBy has Class name to map, as OO Design suggests.

private Ctc ctc;

}

当我尝试运行该应用程序时,它给了我这个例外。

org.hibernate.AnnotationException: Unknown mappedBy in: com.hrsystem.model.Candidate.ctc, referenced property unknown: com.hrsystem.model.Ctc.Candidate

但是,如果我将mappedBy的值完全作为数据库约定(即@Table(name="candidate")中的小写字母),那么它的效果非常好。

所以我的问题是,为什么我们应该鼓励使用面向对象设计的数据库约定驱动开发?

UPDATE ---

这是我的Ctc.java实体。

@Entity
@Table(name = "ctc")
public class Ctc {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

private double basic;
private double hra;
private double da;

@OneToOne
@JoinColumn(name = "candidate_id")
private Candidate candidate;

}
它下面有吸气剂和吸气剂.. !!

1 个答案:

答案 0 :(得分:1)

你没有把表名放在mappedBy中,你把引用的名字放在你的对象上。

所以在你的情况下

@OneToOne(mappedBy="candidate", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
//above here, mappedBy has Class name to map, as OO Design suggests.

private Ctc ctc;

我们希望Ctc类是那样的

public class Ctc {

//other properties
@OneToOne
@JoinColumn
 private Candidate candidate