spring-boot - 难以将 1 个父类与 3 个子类的 OneToOne 关系映射
问题描述
我有一个名为 的父类,FoodInfo
以及另外 3 个名为和的子类。这些类中的每一个之间的关系是。Ingredient
Tag
MiscellaneousData
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;
}
}
其他两个子类与 相同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]
解决方案
@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;
}
推荐阅读
- javascript - 类型错误:songs.map 不是函数
- css - clip-path: ellipse 属性如何工作?
- javascript - jQuery preventDefault onclick 函数
- spring - Kubernetes nodeport 外部 ip 不可访问
- c++ - 使用 HTTP2 发出 TLSv1.2 请求
- python - Pandas - 检查行是否包含特定字符串并在新列中返回结果
- javascript - 如何将对象设置为常量并在反应中显示值?
- ibm-cloud - 从 IBM Cloud Function 访问 Cloudant 时出现 401 错误
- ssl - wget ERROR: The certificate of ‘xyz’ is not trusted, has expired
- c# - Outlook VSTO 加载项在 Outlook 中不可见