everybody, I’ve built myself two classes that are circulating.
additive class
@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; }
and class with types
@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; }
when I try to display the code using 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>
I get an endless queries to the database once from one table additive
once from another additive_type
, even when fetch type is marked as lazy fetch = FetchType.LAZY
How do you remedy that?
UPDATE
Unfortunately, neither @JsonIgnoreProperties
nor @JsonIgnore
has led to a break in the circular inquiry. I used these annotations in the rest service and it worked there. Here at thymeleaf it didn’t bring the desired effect.
Advertisement
Answer
I’ve gone over the problem by adding a class to the same table with a list of additions of this type. From the base class I threw out the reference to the list of add-ons.
Additive class and thymeleaf code without changes.
I copied the AdditiveType class to AdditiveTypeFull. I threw out a list of additions from the AdditiveType class. The service returns the class 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 class
@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; }
I realize it’s not an elegant solution, but it works.
As if somebody knew the legal solution, I’d be happy to get used to it.