我正在使用Springboot和MySQL来制作API, 我现在遇到了一个问题,在网上找不到答案:

问题是在我下面的关联表"www.example.com"中,我try 用Lombok初始化getters和setters,但是当我使用@ Data时,我没有得到任何错误,但是当我用RecetteRepository findAll()时,我得到了一个数组的"etapes"为空,但是如果我在"EtapeRecette.java"手动设置getters和setters,它的工作都很好,同样,如果我使用@ Getters和@ Setters,有什么原因@ Data不工作?

我有三张桌子:

Recette.java

package org.microferme.charme.model;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import jakarta.persistence.*;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.sql.Timestamp;
import java.util.Date;
import java.util.Set;

@Data
@NoArgsConstructor
@Entity
@Table(name="Recette")
public class Recette {

    @Id
    private String id;

    @Column(name = "nom")
    private String nom;

    @Column(name = "nb_personne")
    private int nbPersonne;

    @Column(name = "prix_par_personne")
    private float prixParPersonne;

    @OneToMany(mappedBy = "recette", cascade = CascadeType.ALL, orphanRemoval = true)
    @JsonIgnoreProperties("recette")
    private Set<MediaRecette> medias;

    @OneToMany(mappedBy = "recette", cascade = CascadeType.ALL, orphanRemoval = true)
    @JsonIgnoreProperties("recette")
    private Set<StockUtile> ingredients;

    @OneToMany(mappedBy = "recette", cascade = CascadeType.ALL, orphanRemoval = true)
    @JsonIgnoreProperties("recette")
    private Set<EtapeRecette> etapes;

    public Recette(String nom, int nbPersonne, float prixParPersonne) {
        //Si l'id n'est pas spécifié on prend la timestamp actuelle
        Date date = new Date();
        this.id = String.valueOf(new Timestamp(date.getTime()).getTime());

        this.nom = nom;
        this.nbPersonne = nbPersonne;
        this.prixParPersonne = prixParPersonne;
    }

    public void addMedia(MediaRecette media) {
        this.medias.add(media);
    }

    public void addIngredient(StockUtile ingredient) {
        this.ingredients.add(ingredient);
    }

    public void addEtape(EtapeRecette etapeRecette) {
        this.etapes.add(etapeRecette);
    }

}

ETape.java.etape.java.

package org.microferme.charme.model;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import jakarta.persistence.*;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;
import java.util.Set;

@Data
@Entity
@Table(name = "Etape")
public class Etape {

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

    @Column(name = "ordre")
    private float ordre;

    @Column(name = "duree")
    private float duree;

    @Column(name = "description")
    private String description;

    @ManyToOne
    private Ustensile ustensile;

    public Etape() {
    }

    public Etape(float ordre, float duree, String description, Ustensile ustensile) {
        this.ordre = ordre;
        this.duree = duree;
        this.description = description;
        this.ustensile = ustensile;
    }
}

磁带接收器,它是接收器和磁带之间的关联表,以便具有多对多关系

package org.microferme.charme.model;

import jakarta.persistence.*;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.microferme.charme.model.embeddable.EtapeRecetteId;


@Entity
@Data
@Table(name = "EtapeRecette")
public class EtapeRecette {

    @EmbeddedId
    private EtapeRecetteId id;

    @ManyToOne(cascade = CascadeType.ALL)
    @MapsId("recetteId")
    private Recette recette;

    @ManyToOne(cascade = CascadeType.ALL)
    @MapsId("etapeId")
    private Etape etape;

    public EtapeRecette() {
    }

    public EtapeRecette(Recette recette, Etape etape) {
        this.id = new EtapeRecetteId(recette.getId(), etape.getId());
        this.recette = recette;
        this.etape = etape;
    }

}

推荐答案

不同之处在于,@Data不仅生成getterssetters方法,还生成equalshashCode方法.这些方法的默认实现不能很好地处理一对多和多对一这样的Hibernate关系.如果您使用@Getter@Setter@EqualsAndHashCode(onlyExplicitlyIncluded = true)的组合,并在ID字段中添加@EqualsAndHashCode.Include,则效果会更好.就像这样:

@Entity
@Getter
@Setter
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
@Table(name="Recette")
public class Recette {

    @Id
    @EqualsAndHashCode.Include
    private String id;

    @OneToMany(mappedBy = "recette", cascade = CascadeType.ALL, orphanRemoval = true)
    @JsonIgnoreProperties("recette")
    private Set<EtapeRecette> etapes;

基于:https://thorben-janssen.com/lombok-hibernate-how-to-avoid-common-pitfalls/

Java相关问答推荐

在Spring Boot中测试时出现SQL语法错误

无法在Java中将hhmmss格式的时间解析为LocalTime

如何使用解析器组合子解析Java数组类型签名?

找到允许的最大底片

neo4j java驱动程序是否会在错误发生时自动回滚事务?

工件部署期间出错[Tomcat 8.5.45]

使用JdkClientHttpRequestFactory通过Spring RestClient和Wiemock读取时达到EOF

Kubernetes的Java客户端检索状态.处于终止状态的Pod的阶段';正在运行';

不推荐使用的Environment.getExternalStorageDirectory().getAbsolutePath()返回的值不同于新的getExternalFilesDir(空)?

名称冲突具有相同的擦除

Hibernate EmptyInterceptor可以工作,但不能拦截器

Java:使用Class.cast()将对象转换为原始数组

为什么S的文档中说常量方法句柄不能在类的常量池中表示?

OpenGL ES 3.0-纹理黑色

Java ArrayList的整数和数组的泛型

使用存储在字符串变量中的路径目录打开.pdf文件

垃圾收集时间长,会丢弃网络连接,但不会在Kubernetes中反弹Pod

我可以在@Cacheable中使用枚举吗

Spring Validator批注不起作用

关于正则表达式的一个特定问题,该问题与固定宽度负向后看有关