3

我想在我的实体中有一个不持久的可查询集合。换句话说,一个短暂的多对多关系。我努力了:

@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 的字段或属性。[字段 questionSetClasses] 违反了此限制。

谁能告诉我处理这个问题的最佳方法?

4

3 回答 3

0

你似乎很困惑。你不能有一段关系,也没有它。你想做什么?

@Transient 或 Java 瞬态意味着 JPA 将完全忽略该字段及其上的任何注释。

您似乎想查询该字段,但没有保留它?这很奇怪,那么这些关系将如何定义呢?请注意,如果您不更改/添加任何内容,则不会保留任何内容。强烈建议您保持对象模型与数据库状态同步。

如果你有一个双向的 ManyToMany,那么一侧必须使用 mappedBy 并且实际上是只读的,并允许读取,但会在持久化时被忽略(但仍应保持)。在 EclipseLink 中,您还可以使用 DescriptorCustomizer 将 ManyToMany 标记为只读,并将映射设置为只读。

EclipseLink 还支持 ManyToManyQueryKeys,允许您加入/查询关系,即使它在对象模型中不存在。

见, http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/Query_Keys

于 2013-01-31T13:55:09.567 回答
0

瞬态注释意味着没有属于 Java 对象的注释字段的数据库列(或连接表)。因此,在字段中同时添加@Transient@ManyToMany注释是矛盾的。

于 2013-01-31T08:14:28.540 回答
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;
}
于 2013-01-31T13:29:52.070 回答