首页 > 解决方案 > 难以将 1 个父类与 3 个子类的 OneToOne 关系映射

问题描述

我有一个名为 的父类,FoodInfo以及另外 3 个名为和的子类。这些类中的每一个之间的关系是。IngredientTagMiscellaneousDataFoodInfoOneToOne

目前,这就是我定义类的方式:

食品信息:

@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;
    }
}

其他两个子类与 相同Ingredient

最后,要插入我所做的所有数据:

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;
}

...在控制台中,我只能看到以下一千次:

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

标签: spring-boothibernatespring-data-jpahibernate-mappingone-to-one

解决方案


@OneToOne应在父子端使用注释来创建双向的一对一映射。

正如错误所说:侧面Referenced property not a (One|Many)ToOne没有映射Ingredient

foodInfo您应该为字段指定实体关联@OneToOne

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

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

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

食品信息类:

@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;
}

推荐阅读