Java Spring boot休眠一对多关系
我有两个实体产品和产品选项。 产品可以有多个产品选项,如图所示,我已将其映射为oneToMany关系Java Spring boot休眠一对多关系,java,spring,spring-boot,set,spring-data,Java,Spring,Spring Boot,Set,Spring Data,我有两个实体产品和产品选项。 产品可以有多个产品选项,如图所示,我已将其映射为oneToMany关系 @Entity public class Product { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private int id; private String description; private String productCategory; private Strin
@Entity
public class Product {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String description;
private String productCategory;
private String optionDescription;
private BigDecimal productBasePrice;
@OneToMany(mappedBy = "product",cascade = CascadeType.ALL)
private Set<ProductOption>productOptions=new HashSet<>();
public Product() {}
public Product(String description, ProductCategory productCategory,String optionDescription, BigDecimal productBasePrice) {
super();
this.description = description;
this.productCategory=productCategory.toString();
this.optionDescription = optionDescription;
this.productBasePrice = productBasePrice;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getDescription() {
return description;
}
public String getProductCategory() {
return productCategory;
}
public void setProductCategory(String productCategory) {
this.productCategory = productCategory;
}
public void setDescription(String description) {
this.description = description;
}
public String getOptionDescription() {
return optionDescription;
}
public void setOptionDescription(String optionDescription) {
this.optionDescription = optionDescription;
}
public BigDecimal getProductBasePrice() {
return productBasePrice;
}
public void setProductBasePrice(BigDecimal productBasePrice) {
this.productBasePrice = productBasePrice;
}
public Set<ProductOption> getProductOptions() {
return productOptions;
}
public void setProductOptions(Set<ProductOption> productOptions) {
this.productOptions = productOptions;
}
}
这就是我初始化数据的方式
@Component
public class WebsiteBootstrap implements ApplicationListener<ContextRefreshedEvent>{
private ProductRepository productRepository;
@Override
public void onApplicationEvent(ContextRefreshedEvent arg0) {
initProducts();
}
public WebsiteBootstrap( ProductRepository productRepository,
ProductOptionRepository productOptionRepository) {
this.productRepository=productRepository;
}
private void initProducts() {
ProductOption productOpton1=new ProductOption("mit Cocktailsauce", new BigDecimal(0), null, null, null, null);
ProductOption productOpton2=new ProductOption("mit Joghurtsauce", new BigDecimal(0), null, null, null, null);
ProductOption productOpton3=new ProductOption("ohne Sauce", new BigDecimal(0), null, null, null, null);
Product product37= new Product("Falafel", ProductCategory.Vegatarische_Döner, "Wahl aus: mit Cocktailsauce, mit Joghurtsauce oder ohne Sauce.", new BigDecimal(5.00));
product37.getProductOptions().add(productOpton1);
product37.getProductOptions().add(productOpton2);
product37.getProductOptions().add(productOpton3);
this.productRepository.save(product37);
}
在数据库中,我无法找到产品id
映射中缺少了什么?ProductOptions在您的例子中是子实体,它包含带有外键的列,因此负责保存关系。您必须在子端保存实体:
private void initProducts() {
ProductOption productOpton1=new ProductOption("mit Cocktailsauce", new BigDecimal(0), null, null, null, null);
ProductOption productOpton2=new ProductOption("mit Joghurtsauce", new BigDecimal(0), null, null, null, null);
ProductOption productOpton3=new ProductOption("ohne Sauce", new BigDecimal(0), null, null, null, null);
Product product37= new Product("Falafel", ProductCategory.Vegatarische_Döner, "Wahl aus: mit Cocktailsauce, mit Joghurtsauce oder ohne Sauce.", new BigDecimal(5.00));
product37.getProductOptions().add(productOpton1);
product37.getProductOptions().add(productOpton2);
product37.getProductOptions().add(productOpton3);
productOpton1.setProduct(product37);
productOpton2.setProduct(product37);
productOpton3.setProduct(product37);
this.productRepository.save(product37);
}
删除@JoinColumn,它将被自动推断。此外,还应该映射关系的两端。您正在创建一个没有产品的ProductOption,ProductOption负责映射关系。因此,您应该在ProductOption上调用setProduct,并将其添加到productOptions列表中。@M.Deinum您能帮我解决我在多个映射中面临的另一个问题吗?
private void initProducts() {
ProductOption productOpton1=new ProductOption("mit Cocktailsauce", new BigDecimal(0), null, null, null, null);
ProductOption productOpton2=new ProductOption("mit Joghurtsauce", new BigDecimal(0), null, null, null, null);
ProductOption productOpton3=new ProductOption("ohne Sauce", new BigDecimal(0), null, null, null, null);
Product product37= new Product("Falafel", ProductCategory.Vegatarische_Döner, "Wahl aus: mit Cocktailsauce, mit Joghurtsauce oder ohne Sauce.", new BigDecimal(5.00));
product37.getProductOptions().add(productOpton1);
product37.getProductOptions().add(productOpton2);
product37.getProductOptions().add(productOpton3);
productOpton1.setProduct(product37);
productOpton2.setProduct(product37);
productOpton3.setProduct(product37);
this.productRepository.save(product37);
}