我在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并不那么聪明。任何解决方案?
答案 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,因此在此自定义格式化程序中仅解析了带注释的属性。