播放框架2 ebean @manytoone列指定两次

时间:2014-06-28 07:52:33

标签: java playframework-2.0 one-to-many ebean many-to-one

我正在使用ebean运行一些问题(使用play framework 2 version 2.2.1) 我有两个班:

我的图表类:

public class Graph extends Model {
     @Id
     @Column(name="id")
     private String id;

     @Column(name="type")
     private String type;

     @OneToMany(mappedBy="valGraph", cascade=CascadeType.ALL)
     private List<Val> valItems; 

和我的值类(使用Val.graphId外键Graph.id):

public class Val extends Model
     @Id
     @Column(name="valId")
     private String valId;  

     @Id
     @Column(name="graphId")
     private String graphId;

     @Column(name="Key")
     private String Key;

     @Column(name="Value")
     private String Value;

     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(name="graphId")
     private Graph valGraph;

但是在尝试保存新项目时出现此错误:

  

javax.persistence.PersistenceException:ERROR执行DML bindLog []错误[Column&#39; graphId&#39;指定两次]

1 个答案:

答案 0 :(得分:8)

在网络上的众多搜索者之后,我找到了这个答案here - 感谢jtal!

只是总结一下问题:

使用Ebean我做了一个@ManyToOne实体,无论如何都没有在数据库中实现, 甚至更多的连接字段,在我的情况下

  

graphId

是一个有效值的有效字段。

当尝试加入该字段上的列时,它将始终失败,因为它会创建此sql查询:

SELECT 
*
FROM
    Val;

select 
    t0.valId c0, 
    t0.graphId c1, 
    t0.Key c2, 
    t0.Value c3, 
    t0.graphId c4 <---- notice this duplicate
from 
    graph_val t0 

为了解决这个问题,我告诉ebean 不要使用第二组属性

我的新ebean元素如下所示:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="graphId", insertable = false, updatable = false)
private Graph valGraph;

它有效! =)