尝试绑定 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,以便在此自定义格式化程序中仅解析我的注释属性。
我在 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,以便在此自定义格式化程序中仅解析我的注释属性。