尝试绑定 ManyToMany 关系时出错

error trying to bind ManyToMany relationShip

我在 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) Error injecting constructor, javax.persistence.PersistenceException: Error on models.ArtifactEntry.timestamps. mappedBy property [models.TimestampEntry.artifacts] is not a ManyToMany?

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

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

"mappedBy" 端需要用@JoinTable 注释以指定哪个table 包含您的工件。请参阅本教程:

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;

好的,正如我在之前的 post 中编辑的那样,问题似乎是 EBeans 没有读取属性的类型层次结构来匹配 ManyToMany 关系。它只需要在两个 classes.

上匹配

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

我最终删除了 "ArtifactsList",而不是将 SimpleFormatter 与 List 一起使用,我将其更改为使用 AnnotationFormatter,以便在此自定义格式化程序中仅解析我的注释属性。