【问题标题】:JPA : Select parent and child with oneToMany relatinshipsJPA:选择具有一对多关系的父母和孩子
【发布时间】:2018-02-12 12:21:39
【问题描述】:

实现一对多关系并选择父子关系 我有一个onetomany 关系,我想做一个查询(选择 *)

文件夹.java

@Entity
@Table(name = "FOLDERS")
public class Folders implements Serializable {
    @Id
    @Column(name = "id")
    Long id;
    @ManyToOne
    @JoinColumn(name = "Folder_Author", insertable=false, updatable=false)
    private Authors author;
    // Getter + setter
}

Authors.java

@Entity
@Table(name = "AUTHORS")
public class Authors implements Serializable {

    @Id
    @Column(name = "id")
    Long id;
    @OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.PERSIST)
    @JoinColumn(name = "Folder_Author", referencedColumnName = "id", nullable=false)
    private List<Folders> folders = new ArrayList<Folders>();
}

我的要求:

Query query = em.createQuery("SELECT f FROM Folders f");
return query.getResultList();

我得到了这个结果:

[
    {   
        "id":29,
        "noFolder":"0017",
        "author":{
            "id":9,
            "name":"Alpha",
            "service":null,
            "folders":[
                {"id":29,
                "noFolder":"0017",
                "author":{
                    "id":9,
                    "name":"Alpha",
                    "service":null,
                    "folders":[
                    {
                        "id":29,
                        "noFolder":"0017",
                        "author":{
                        "id":9,
                        "name":"Alpha",
                        "service":null,
                        "folders":[
                            ..
                            ..
            }
]       

我的代码有什么问题?执行查询时出现什么问题我得到了这个结果.. .. 我想得到这个结果

[
    {   
        "id":29,
        "noFolder":"0017",
        "author":{
            "id":9,
            "name":"Alpha",
            "service":null,
            }
    }
]           

【问题讨论】:

  • 您的意思是您希望 1-N 字段延迟加载,并将其设置为 EAGER?
  • 是的,你说得对,但是当我尝试惰性时,我得到了这个错误:Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: business.entities.folders.Authors.folders, could not initialize proxy - no Session at rg.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:587) at ..
  • OneToMany 也需要一个 mappedBy 指定链接双方。
  • 我更新了,现在是这样的:@OneToMany(mappedBy="author", targetEntity=Folders.class, fetch=FetchType.LAZY, cascade=CascadeType.PERSIST) @Fetch(FetchMode.SELECT) private List&lt;Folders&gt; folders = new ArrayList&lt;Folders&gt;();
  • wtf 是字段“发起者”吗?应该是您发布的代码中的“作者”

标签: hibernate jpa hibernate-mapping hibernate-onetomany


【解决方案1】:

只需在您的收藏字段中使用@JsonIgnore,如下所示:

@OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.PERSIST)
    @JoinColumn(name = "Folder_Author", referencedColumnName = "id", nullable=false)
    @JsonIgnore
    private List<Folders> folders = new ArrayList<Folders>();

【讨论】:

  • 是的,但如果我这样做,我怎样才能获得父级(作者)的值?就像每个文件夹我想得到他的作者...
  • @user1814879 你必须使用@JsonIgnore 打破无限循环,否则它永远不会工作。所以你必须放在一对多的一面或多对一的一面。
【解决方案2】:

在作者类中的文件夹列表上使用@JsonBackReference 来防止递归序列化。

另见here

【讨论】:

    猜你喜欢
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    • 2015-04-18
    • 2014-12-19
    相关资源
    最近更新 更多