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除外)。非常感谢你的帮助,我真的非常感谢你花时间来帮助我!!