Spring boot 很难将一个父类与三个子类的一对一关系映射

Spring boot 很难将一个父类与三个子类的一对一关系映射,spring-boot,hibernate,spring-data-jpa,hibernate-mapping,one-to-one,Spring Boot,Hibernate,Spring Data Jpa,Hibernate Mapping,One To One,我有一个名为FoodInfo的父类,还有3个名为component、Tag和mischellaneousdata的子类。FoodInfo与这些类之间的关系是OneToOne 目前,我是这样定义这些类的: 食品信息: @Entity @Table(name="food") public class FoodInfo { @Id @Column(name="code") private Long code;

我有一个名为
FoodInfo
的父类,还有3个名为
component
Tag
mischellaneousdata
的子类。
FoodInfo
与这些类之间的关系是
OneToOne

目前,我是这样定义这些类的:

食品信息:

@Entity
@Table(name="food")
public class FoodInfo {
    
    @Id
    @Column(name="code")
    private Long code;
    
    @OneToOne(mappedBy = "foodInfo", cascade = CascadeType.ALL)
    private Tag tag;
    
    @OneToOne(mappedBy = "foodInfo", cascade = CascadeType.ALL)
    private Ingredient ingredient;
    
    @OneToOne(mappedBy = "foodInfo", cascade = CascadeType.ALL)
    private MiscellaneousData misc;

    //And the getters and setters for all attributes including:

    public Ingredient getIngredient() {
        return ingredient;
    }

    public MiscellaneousData getMisc() {
        return misc;
    }

    public String getProduct_name() {
        return product_name;
    }
    
    public void setTag(Tag tag) {
        this.tag = tag;
    }

    public void setIngredient(Ingredient ingredient) {
        this.ingredient = ingredient;
    }

    public void setMisc(MiscellaneousData misc) {
        this.misc = misc;
    }
}
在配料类中:

@Entity
@Table(name="ingredient")
public class Ingredient {
    
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @JoinColumn(name = "code")
    private FoodInfo foodInfo;

    public FoodInfo getFoodInfo() {
        return foodInfo;
    }
    public void setFoodInfo(FoodInfo foodInfo) {
        this.foodInfo = foodInfo;
    }
}
其他两个子类与
成分
相同

最后,插入我喜欢的所有数据:

FoodInfo food = new FoodInfo();
Ingredient ing = new Ingredient();
MiscellaneousData misc = new MiscellaneousData();
Tag tag = new Tag();

//And after setting all their attributes...

food.setTag(tag);
food.setMisc(misc);
food.setIngredient(ing);

tag.setFoodInfo(food);
misc.setFoodInfo(food);
ing.setFoodInfo(food);
        
foodRepository.save(food);
现在,当我尝试运行程序时,一个错误显示:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name  'entityManagerFactory' defined in class path resource  
[org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]:

Invocation of init  method failed; nested exception is org.hibernate.AnnotationException: Referenced property not a  (One|Many)ToOne: com.guillermo.off.model.Ingredient.foodInfo in mappedBy of  com.guillermo.off.model.FoodInfo.ingredient 

............

Caused by: org.hibernate.AnnotationException: Referenced property not a (One|Many)ToOne: com.guillermo.off.model.Ingredient.foodInfo in mappedBy of com.guillermo.off.model.FoodInfo.ingredient
在以前的尝试中,我以不同的方式使用注释,成功地将数据插入数据库中,但当我试图获取所有这些数据时,程序陷入了无休止的循环

任何帮助都将不胜感激!提前谢谢

编辑:

按照@Hülya的建议,数据库中的信息似乎是正确的:

但是,当我请求信息时,我遇到了一个看似无限的循环

我请求数据的代码是:

@GetMapping("/food")
public List<FoodInfo> findFood(HttpServletResponse response) {
    List<FoodInfo> food = foodService.findAll();
    return food;
}
@GetMapping(“/food”)
公共列表findFood(HttpServletResponse){
List food=foodService.findAll();
归还食物;
}
…在控制台中,我只能看到以下一千次:

在 com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) ~[jackson-databind-2.11.4.jar:2.11.4]at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755) ~[jackson-databind-2.11.4.jar:2.11.4]


@OneToOne
注释应同时用于父端和子端,以创建双向一对一映射

正如错误所说:
引用的属性不是(一个|多个)一个
成分
端没有映射

您应该使用
@OneToOne
指定
foodInfo
字段的实体关联:

@Entity
@Table(name="ingredient")
public class Ingredient {
    // ...
    @OneToOne
    @JoinColumn(name = "code")
    private FoodInfo foodInfo;
}

更新
com.fasterxml.jackson.databind
异常:

当使用jackson序列化双向关系时,循环依赖会导致无休止的循环。要打破这个循环,您应该添加
@JsonManagedReference
@JsonBackReference
注释:

FoodInfo类:

@Entity
@Table(name="food")
public class FoodInfo {
    // ...
    @OneToOne(mappedBy = "foodInfo", cascade = CascadeType.ALL)
    @JsonManagedReference
    private Ingredient ingredient;
}
成分类别:

@Entity
@Table(name="ingredient")
public class Ingredient {
    //...
    @OneToOne
    @JoinColumn(name = "code")
    @JsonBackReference
    private FoodInfo foodInfo;
}

非常感谢,胡利亚。然而,它不能100%工作。数据库中的信息正常,但由于似乎是一个无止境的循环,无法获取它。然而,我真的很感激你花时间来帮助我@Calfa我正在为最新状态添加更新…它像一个符咒一样工作!!不管怎样,我都会试图找到一个很好的教程,其中详细解释了所有这些内容,因为有大量的注释,当面对表之间的关系时,我总是会有疑问(oneToOne hehe除外)。非常感谢你的帮助,我真的非常感谢你花时间来帮助我!!