【问题标题】:endless hibernate query in thymeleaf for classes @OneToMeny and @ManyToOnethymeleaf 中针对 @OneToMeny 和 @ManyToOne 类的无尽休眠查询
【发布时间】:2020-06-06 12:55:52
【问题描述】:

大家, 我已经为自己构建了两个正在流行的类。

加法类

@Entity
@Table(name = "additive", schema = "dbo")
@Data
@NoArgsConstructor
public class Additive{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "additive_id")
    private Integer id;

    @ManyToOne(targetEntity = AdditiveType.class, fetch = FetchType.LAZY)
    @JoinColumn(name = "additive_type_id")
    private AdditiveType additiveType;

    private String description;
    private BigDecimal price;
}

和类型的类

@Entity
@Table(name = "additive_type", schema = "dbo")
@Data
@NoArgsConstructor
public class AdditiveType{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "additive_type_id")
    private Integer id;

    @OneToMany(targetEntity = Additive.class, fetch = FetchType.LAZY)
    @JoinColumn(name = "additive_type_id")
    private Set<Additive> additives;

    private String description;
}

当我尝试使用 thymeleaf 显示代码时

<div th:each="aType:${types}">
    <h2 th:text="${aType.description}">type</h2>
    <div>
        <div th:each="additive:${aType.additives}">
            <div>
                <img alt="${additive.description}"
                     src="...">
                <div>
                    <h5 th:text="${additive.description}">additive description</h5>
                </div>
                <div>
                    <form method="post"
                          th:action="...">
                        <input name="id" th:value="${additive.id}" type="hidden"/>
                        <button type="submit">select this</button>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>

我从一个表additive 一次从另一个additive_type 对数据库进行无休止的查询,即使提取类型被标记为惰性fetch = FetchType.LAZY

你如何解决这个问题?

更新

不幸的是,@JsonIgnoreProperties@JsonIgnore 都没有导致循环查询中断。我在其余服务中使用了这些注释,它在那里工作。在 thymeleaf,它并没有带来预期的效果。

【问题讨论】:

    标签: java spring thymeleaf


    【解决方案1】:

    我认为您遇到了循环序列化问题。

    你有一个Additive,它有一个与Additives相关的AdditiveTypes,它有一个与Additives相关的AdditiveTypes......等等。

    解决它的一种方法是使用@JsonIgnoreProperties 注释您的一个类属性。例如:

    @Entity
    @Table(name = "additive_type", schema = "dbo")
    @Data
    @NoArgsConstructor
    public class AdditiveType{
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "additive_type_id")
        private Integer id;
    
        @OneToMany(targetEntity = Additive.class, fetch = FetchType.LAZY)
        @JoinColumn(name = "additive_type_id")
        @JsonIgnoreProperties("additiveType")
        private Set<Additive> additives;
    
        private String description;
    }
    

    所以在序列化AdditiveType时,内部的additivesTypes不会被序列化。

    更新

    另外我认为,如果你只用 @JsonIgnore 注释,那么 AdditiveTypesAdditives 根本不会被序列化

    【讨论】:

    • 详细解释请访问:hellokoding.com/…
    • 不幸的是,@JsonIgnoreProperties@JsonIgnore 都没有导致循环查询中断。我在其余服务中使用了这些注释,它在那里工作。不幸的是,在 thymeleaf,它并没有带来预期的效果。
    【解决方案2】:

    我已经通过将一个类添加到同一个表中来解决这个问题,并列出了这种类型的添加列表。我从基类中删除了对附加组件列表的引用。

    添加类和 thymeleaf 代码无需更改。

    我将 AdditiveType 类复制到 AdditiveTypeFull。我从 AdditiveType 类中抛出了一个添加列表。服务返回类 AdditiveTypeFull

    @Entity
    @Table(name = "additive_type", schema = "dbo")
    @Data
    @NoArgsConstructor
    public class AdditiveType{
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "additive_type_id")
        private Integer id;
    
        private String description;
    }
    

    AdditiveTypeFull 类

    @Entity
    @Table(name = "additive_type", schema = "dbo")
    @Data
    @NoArgsConstructor
    public class AdditiveTypeFull{
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "additive_type_id")
        private Integer id;
    
        @OneToMany(targetEntity = Additive.class, fetch = FetchType.LAZY)
        @JoinColumn(name = "additive_type_id")
        private Set<Additive> additives;
    
        private String description;
    }
    

    我意识到这不是一个优雅的解决方案,但它确实有效。

    好像有人知道法律解决方案一样,我很乐意习惯它。

    【讨论】:

      猜你喜欢
      • 2014-07-31
      • 1970-01-01
      • 2018-07-30
      • 2021-02-02
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多