我有两个这样的课程
package models;
import java.util.*;
import javax.persistence.*;
import play.db.jpa.*;
@Entity
@Table(name = "commitment_type_value")
public class CommittmentTypeValue extends Model{
@Id
@Column(name = "id", nullable = false)
public Long id;
@Column(name = "value", nullable = true)
public String type;
@ManyToOne
@JoinColumn(name="commitment_type_id")
public CommitementType commitmentType;
public CommittmentTypeValue(){
}
}
-------------
package models;
import java.util.*;
import javax.persistence.*;
import play.db.jpa.*;
/**
*
* @author hatem
*/
@Entity
@Table(name = "commitment_type")
public class CommitementType extends Model{
@Id
@Column(name = "id", nullable = false)
public Long id;
@Column(name = "type", nullable = true)
public String type;
@OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="commitmentType")
public List<CommittmentTypeValue> commitmentTypeValues;
public CommitementType(){
}
}
当我执行我的应用时,会出现此问题:
发生JPA错误(无法构建EntityManagerFactory):外部 关键引用models.CommitementType from models.CommittmentTypeValue 列数错误。应该是2
拜托,任何人都可以告诉我有什么问题吗?
答案 0 :(得分:3)
请检查您的外键列名称是否与列名完全匹配。
修改强> 如果您的问题仍未解决,请检查您的persistance.xml是否已
<property name="generateDdl" value="true" />
如果它已经有,那么检查你是否在生成表时遇到任何错误。
如果是,则清除表中的数据 要么 在配置文件中添加drop-and-create-tables选项 要么 更改您的代码如下
@ManyToOne(optional=true)
@JoinColumn(name="commitment_type_id", nullable = true)
public CommitementType commitmentType;
因为您可能在表中有旧数据可能会停止创建新表。
答案 1 :(得分:0)
班级CommittmentTypeValue
@ManyToOne
@JoinColumn(name="commitment_type_id" referencedColumnName="id" )
public CommitementType commitmentType;
同时指定目标实体
@OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, targetEntity=CommittmentTypeValue.class, mappedBy="commitmentType")
public List<CommittmentTypeValue> commitmentTypeValues;
答案 2 :(得分:0)
错误听起来像你在CommitementType中的Id是复合的,所以你的外键必须包含两列。
包括CommitementType的代码。