我想在我的实体中有一个不可持续的可查询集合。换句话说,一个瞬态的ManytoMany关系。我试过了:
@Transient
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name="QuestionSetClass_Link", schema = "SVY",
joinColumns={@JoinColumn(name="QuestionSetID", referencedColumnName="QuestionSetID")},
inverseJoinColumns={@JoinColumn(name="QuestionSetClassID", referencedColumnName="ID")})
private Collection<QuestionSetClass> questionSetClasses;
public Collection<QuestionSetClass> getQuestionSetClasses(){
return questionSetClasses;
}
public void setQuestionSetClasses(Collection<QuestionSetClass> questionSetClasses){
this.questionSetClasses = questionSetClasses;
}
但EclipseLink不会部署它并给我错误:映射注释不能应用于指定了@Transient的字段或属性。 [field questionSetClasses]违反了此限制。
谁能告诉我解决这个问题的最佳方法?
答案 0 :(得分:1)
@Transient或Java transient意味着JPA将完全忽略该字段及其上的任何注释。
您似乎想要查询该字段,但没有持久存在?这很奇怪,那么关系将如何定义呢?请注意,如果您不更改/添加任何内容,则不会保留任何内容。强烈建议您保持对象模型与数据库状态同步。
如果你有双向ManyToMany,那么一方必须使用mappedBy并且实际上是只读的,并且允许读取,但是在persist上会被忽略(但是仍然应该被维护)。在EclipseLink中,您还可以使用DescriptorCustomizer将ManyToMany标记为只读,并将映射设置为只读。
EclipseLink还支持允许您加入/查询关系的ManyToManyQueryKeys,即使它在对象模型中不存在。
请参阅, http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/Query_Keys
答案 1 :(得分:0)
瞬态注释意味着没有属于Java对象的带注释字段的数据库列(或连接表)。因此,将@Transient
和@ManyToMany
注释添加到字段是相互矛盾的。
答案 2 :(得分:0)
我找到了答案。声明私有元素不是私有元素,而是瞬态元素。然后我可以使用声明的fetch类型保留ManyToMany。
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name="QuestionSetClass_Link", schema = "SVY",
joinColumns={@JoinColumn(name="QuestionSetID", referencedColumnName="QuestionSetID")},
inverseJoinColumns={@JoinColumn(name="QuestionSetClassID", referencedColumnName="ID")})
transient Collection<QuestionSetClass> questionSetClasses;
public Collection<QuestionSetClass> getQuestionSetClasses(){
return questionSetClasses;
}
public void setQuestionSetClasses(Collection<QuestionSetClass> questionSetClasses){
this.questionSetClasses = questionSetClasses;
}