JPA manytomany瞬态收集

时间:2013-01-31 04:27:07

标签: java-ee jpa many-to-many eclipselink transient

我想在我的实体中有一个不可持续的可查询集合。换句话说,一个瞬态的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]违反了此限制。

谁能告诉我解决这个问题的最佳方法?

3 个答案:

答案 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;
}