尝试绑定ManyToMany relationShip时出错

时间:2015-09-28 19:04:49

标签: java playframework many-to-many ebean

我在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?

编辑:在研究了更多之后,问题显然是&#34;工件&#34;不是直接类型&#34; List&#34;但它的一个子类。 Ebean并不那么聪明。任何解决方案?

3 个答案:

答案 0 :(得分:0)

查看public ArtifactsList artifacts:此字段应该是一个集合(例如List<ArtifactEntry> artifacts),但事实并非如此。 您编码的是双向OneToMany,您可能希望使用artifacts注释ManyToOne或将该字段转换为集合并保留ManyToMany注释。

答案 1 :(得分:0)

&#34; mappedBy&#34; side需要使用@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;

答案 2 :(得分:0)

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

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

我最终删除了&#34; ArtifactsList&#34;而使用带有List的SimpleFormatter,我已将其更改为使用AnnotationFormatter,因此在此自定义格式化程序中仅解析了带注释的属性。