我有以下两种领域模型,
@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")
中的小写字母),则可以很好地工作。所以我的问题是,尽管我们正在使用面向对象设计,为什么我们应该鼓励数据库约定驱动的开发呢?
更新-
这是我的
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;
}
以及下面的吸气剂和吸气剂.. !!
最佳答案
您不将表名放在mapledBy中,而是将引用的名称放在对象中。
所以你的情况
@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