【问题标题】:JPA manytomany transient collectionJPA 多对多瞬态集合
【发布时间】:2013-01-15 02:58:06
【问题描述】:

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

@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] 违反了此限制。

谁能告诉我最好的处理方法?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 这是有道理的,但我需要 @ManyToMany 才能添加 fetch 属性。
    【解决方案2】:

    我找到了答案。它是将私有元素声明为不是私有的,而是作为瞬态的。然后我可以使用声明的 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;
    }
    

    【讨论】:

    • 原来使元素瞬态编译但它不会通过线路发送值。所以这不能创建我需要的只读关系。最后,我将完全以这种方式进行操作,并将构建查询以获得我需要的东西。仍然应该有一种方法来构建它并让它在我看来只读。
    【解决方案3】:

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

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

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

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

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

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

    【讨论】:

    • 除非 Eclipse 链接为映射关系创建(或要求)列!是的,JPA 是一团糟。
    猜你喜欢
    • 2012-02-03
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 2012-06-04
    • 2017-10-15
    • 2018-06-22
    • 1970-01-01
    • 2012-05-13
    相关资源
    最近更新 更多