在jpa hibernate中使用存储库查询sql时的无限递归

Dis*_*Hay 4 java spring hibernate jpa spring-boot

我有两个实体,Promotion其中包含有关促销的信息,其中包含一个Promotion Details产品列表Promotion.以下是我的代码.

促销实体:

@Entity
@Data
public class Promotion {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @OneToMany(mappedBy = "promotion")
    private List<PromotionDetails> details;

    @Column(name = "start_date")
    private Date startDate;

    @Column(name = "end_date")
    private Date endDate;
}
Run Code Online (Sandbox Code Playgroud)

PromotionDetails实体:

@Entity
@IdClass(PromotionDetailsPK.class)
@Data
public class PromotionDetails {

    @Id
    @ManyToOne(optional = false)
    @JoinColumn(name = "promotion_id", referencedColumnName = "promotion_id")
    private Promotion promotion;

    @Id
    @ManyToOne(optional = false)
    @JoinColumn(name="product_id", referencedColumnName="product_id")
    private Product product;

    @Column()
    private double discount;

}
Run Code Online (Sandbox Code Playgroud)

我想检索一个Promotion使用JPA的产品.

PromotionRepository:

@Repository
public interface PromotionRepository extends JpaRepository<Promotion, Long> {

    @Query("SELECT promotion "
            + "FROM Promotion promotion "
            + "INNER JOIN promotion.details details "
            + "WHERE details.product.id = :productId "
            + "AND CURRENT_DATE BETWEEN promotion.startDate AND promotion.endDate")
    Promotion findOneByProductId(@Param("productId") Long productId);

}
Run Code Online (Sandbox Code Playgroud)

但是发生了这个错误:

堆栈跟踪:

Caused by: java.lang.StackOverflowError: null
    at java.lang.StringBuilder.append(Unknown Source)
    at java.lang.StringBuilder.<init>(Unknown Source)
    at com.example.entity.PromotionDetails.toString(PromotionDetails.java:18)
    at java.lang.String.valueOf(Unknown Source)
    at java.lang.StringBuilder.append(Unknown Source)
    at java.util.AbstractCollection.toString(Unknown Source)
    at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:527)
    at java.lang.String.valueOf(Unknown Source)
    at java.lang.StringBuilder.append(Unknown Source)
    at com.example.entity.Promotion.toString(Promotion.java:18)
    at java.lang.String.valueOf(Unknown Source)
    at java.lang.StringBuilder.append(Unknown Source)
    at com.example.entity.PromotionDetails.toString(PromotionDetails.java:18)
    at java.lang.String.valueOf(Unknown Source)
    at java.lang.StringBuilder.append(Unknown Source)
    at java.util.AbstractCollection.toString(Unknown Source)
    at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:527)
    at java.lang.String.valueOf(Unknown Source)
    at java.lang.StringBuilder.append(Unknown Source)
    at com.example.entity.Promotion.toString(Promotion.java:18)
    ...
    ...
    ...
    ...
    at java.lang.String.valueOf(Unknown Source)
    at java.lang.StringBuilder.append(Unknown Source)
    at jp.co.worksap.stm.entity.sales.PromotionDetails.toString(PromotionDetails.java:18)
    at java.lang.String.valueOf(Unknown Source)
    at java.lang.StringBuilder.append(Unknown Source)
    at java.util.AbstractCollection.toString(Unknown Source)
    at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:527)
    at java.lang.String.valueOf(Unknown Source)
    at java.lang.StringBuilder.append(Unknown Source)
    at jp.co.worksap.stm.entity.sales.Promotion.toString(Promotion.java:18)
Run Code Online (Sandbox Code Playgroud)

我知道这似乎Promotion是呼唤PromotionDetailsPromotionDetails呼叫Promotion等等.但是,我该如何解决这个问题呢?

- 编辑 -

我想补充一点.我正在使用Lombok生成Getter,Setter和toString

dun*_*nni 10

您可以从Lombok中的ToString生成中排除字段.为此,您必须将@ToString注释添加到类中并添加要排除的字段.在你的情况,我会排除该领域details中的Promotion类:

@ToString(exclude="details")
public class Promotion {}
Run Code Online (Sandbox Code Playgroud)