【发布时间】:2021-11-01 07:34:25
【问题描述】:
我想创建一个带有类别的新产品。如果该类别不存在,则还要创建该类别。到目前为止,这个用例很好。
当我想创建另一个具有相同类别的产品时,我的第二个用例出现了。由于我的类别实体具有唯一名称,因此当我调用我的服务时,它会抛出重复的错误键。我想要的是能够创建第二个产品并更新类别以拥有该产品。
这是我的类别实体
package com.smolano.cupboard.entities;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import javax.persistence.*;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
@Entity
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class Category implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true)
private String name;
@ManyToMany(mappedBy = "categories", fetch = FetchType.LAZY)
private Set<Product> products = new HashSet<>();
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Product> getProducts() {
return products;
}
public void setProducts(Set<Product> products) {
this.products = products;
}
}
这是我的产品实体
package com.smolano.cupboard.entities;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import javax.persistence.*;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
@Entity
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class Product implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(
name = "product_categories",
joinColumns = {@JoinColumn(name = "product_id")},
inverseJoinColumns = {@JoinColumn(name = "category_id")}
)
private Set<Category> categories = new HashSet<>();
private String barCode;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Category> getCategories() {
return categories;
}
public void setCategories(Set<Category> categories) {
this.categories = categories;
}
public String getBarCode() {
return barCode;
}
public void setBarCode(String barCode) {
this.barCode = barCode;
}
}
我的分类库
package com.smolano.cupboard.repositories;
import com.smolano.cupboard.entities.Category;
import org.springframework.data.jpa.repository.JpaRepository;
public interface CategoryRepository extends JpaRepository<Category, Long> {
}
和我的产品存储库
package com.smolano.cupboard.repositories;
import com.smolano.cupboard.entities.Product;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ProductRepository extends JpaRepository<Product, Long> {
}
我的其余代码可以在这里找到 https://github.com/santfirax/backend-product-store-java
【问题讨论】:
-
我尝试了一些我在 SO 上看到的解决方案,但它不起作用。一种是实现 hascode 和 equals 方法,但调用 GET 方法时会导致无限递归。
标签: java spring spring-boot hibernate jpa