【问题标题】:error trying to bind ManyToMany relationShip尝试绑定多对多关系时出错
【发布时间】:2015-09-28 19:04:48
【问题描述】:

我正在使用带有 Play Framework 2.4 的 ebean

我不明白问题出在哪里。这是我的两个 bean 的简化版本:

@Entity
public class ArtifactEntry extends Model {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public int id;

    @play.data.validation.Constraints.Required
    public String name;

    @ManyToMany(mappedBy = "artifacts")
    public List<TimestampEntry> timestamps = new ArrayList<TimestampEntry>();
}

还有我的另一个豆子:

@Entity
public class TimestampEntry extends Model {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public int id;

    @play.data.validation.Constraints.Required
    @Index
    public String timestamp;

    public Date timestampDate;

    @play.data.validation.Constraints.Required
    @Index
    public String buildNumber;

    @ManyToMany(cascade = CascadeType.ALL)
    public ArtifactsList artifacts = new ArtifactsList();

    public static class ArtifactsList extends ArrayList<ArtifactEntry> {

    }
}

错误信息是:

1) 注入构造函数时出错,javax.persistence.PersistenceException:models.ArtifactEntry.timestamps 上的错误。 mappedBy 属性 [models.TimestampEntry.artifacts] 不是 ManyToMany?

编辑:经过更多研究,问题显然是“工件”不是直接类型“列表”而是它的子类。 Ebean没有那么聪明。有什么解决办法吗?

【问题讨论】:

  • 刚刚拍摄...如果我记得很清楚,我前段时间在内部类和 Ebean 方面遇到了一些问题,解决方案是将类移动到单独的文件中。

标签: java playframework many-to-many ebean


【解决方案1】:

public ArtifactsList artifacts:这个字段应该是一个集合(例如List&lt;ArtifactEntry&gt; artifacts),但它不是。 您编码的是双向 OneToMany,您可能希望使用 ManyToOne 注释 artifacts 或将该字段转换为集合并保留 ManyToMany 注释。

【讨论】:

  • 如果你在课堂上看到了。 ArtifactsList 正在扩展 ArrayList...我需要它来注册自定义格式化程序。
【解决方案2】:

“mappedBy”端需要使用@JoinTable 进行注释,以指定哪个表包含您的工件。请参阅本教程:

http://viralpatel.net/blogs/hibernate-many-to-many-annotation-mapping-tutorial/

@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(name="ARTIFACT_TABLE", 
       joinColumns={@JoinColumn(name="TIMESTAMP_ID")}, 
       inverseJoinColumns={@JoinColumn(name="ARTIFACT_ID")})
public List<ArtifactEntry> artifacts;

【讨论】:

  • joinColumns 和 inverseJoinColumns 是否适用于 Ebean?我认为它对我不起作用。
【解决方案3】:

好的,正如我在上一篇文章中所编辑的,问题似乎是 EBeans 没有读取属性的类型层次结构来匹配多对多关系。它只需要在两个类上都匹配。

首先,我需要用一个扩展 ArrayList 的空类来实现它,这样我就可以用一个自定义的 SimpleFormatter 注册这个类(因为我不想以这种方式解析所有的 List)。

我最终删除了“ArtifactsList”,而不是使用带有 List 的 SimpleFormatter,而是将其更改为使用 AnnotationFormatter,因此只有我的带注释的属性在此自定义格式化程序中被解析。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    相关资源
    最近更新 更多