【问题标题】:play framework 2 ebean @manytoone Column specified twiceplay framework 2 ebean @manytoone 列指定了两次
【发布时间】:2014-06-28 07:52:32
【问题描述】:

我在使用 ebean 时遇到了一些问题(使用 play framework 2 版本 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 execution DML bindLog[] 错误[列'graphId'指定了两次]

【问题讨论】:

  • 这是this issue 的副本。 IE。您的 @Column(name="graphId")@JoinColumn(name="graphId") 具有相同的名称。换一个。
  • Donovan,感谢您的快速回答,我通过更改“@Column(name="graphId")”得到了以下内容:查询已抛出SQLException:字段列表中的未知列 't0.graphId1' 并通过更改 '@JoinColumn(name="graphId")' 我得到:javax.persistence.PersistenceException 未知列 'graphId1' 我在这里不明白什么?
  • 您在哪个数据库上测试(H2、MySQL 等)?您是否应用进化来重新创建/更新表?听起来您已经更改了实体,但您的数据库架构尚未相应更新。
  • 您的 valGraph 属性将由 Ebean 在 MySQL 中的 graphId 列表示。但是,您已经定义了自己的private String graphId。所以你混淆了Ebean。我已经更详细地解释了这一点in this issue。请记住,您应该考虑对象而不是 SQL,让持久性框架来完成它的工作。在您的情况下,我将删除您的 graphId 属性。你不需要它。

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


【解决方案1】:

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

只是总结问题:

使用 Ebean,我创建了一个 @ManyToOne 实体,无论如何都没有在数据库中实现, 就我而言,更多的是连接字段

图形标识

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

当试图加入该字段上的列时,它总是会失败,因为它创建了这个 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;

它有效! =)

【讨论】:

  • 更新:将 name="graphId" 更改为 "graph_id"。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-05
  • 1970-01-01
相关资源
最近更新 更多