JPA与@ManyToOne

时间:2012-12-12 08:35:34

标签: java jpa

我有两个这样的课程

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

拜托,任何人都可以告诉我有什么问题吗?

3 个答案:

答案 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的代码。