如何解决难以映射 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
注释:
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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。