Springboot在oneTOMany关系中添加问题

时间:2020-05-26 03:27:54

标签: spring-boot

我正在按照以下关系编写3个表:

enter image description here

俱乐部等级:

@Setter
@Getter
@Entity
@Table(name = "Club")
public class Club {
    @Id
    @GeneratedValue
    private Long id;

    private String name;
    private String type;
    private String mainPage;
    private String logo;

    @OneToMany(mappedBy="clubProductKey.club", cascade = CascadeType.ALL)
    @JsonIgnoreProperties(value = "clubProductKey.club", allowSetters=true)
    private Set<ClubProduct> clubProducts;
...

产品类别:

@Setter
@Getter
@Entity
@Table(name = "Product")
public class Product {
    @Id
    @GeneratedValue
    private Long id;

    @OneToMany(mappedBy="clubProductKey.product", cascade = CascadeType.ALL)
    @JsonIgnoreProperties(value = "clubProductKey.product", allowSetters=true)
    private Set<ClubProduct> clubProducts;
...

ClubProduct类:

@Setter
@Getter
@Entity
@Table(name = "ClubProduct")
public class ClubProduct {
    @EmbeddedId
    private ClubProductKey clubProductKey;
...

ClubProductKey类:

@Setter
@Getter
@Embeddable
public class ClubProductKey implements Serializable {
    @ManyToOne(cascade = {CascadeType.MERGE,CascadeType.REFRESH })
    @JoinColumn(name = "club_id", referencedColumnName = "id")
    @JsonIgnoreProperties(value = "clubProducts", allowSetters=true)
    private Club club;

    @ManyToOne(cascade = {CascadeType.MERGE,CascadeType.REFRESH })
    @JoinColumn(name = "product_id", referencedColumnName = "id")
    @JsonIgnoreProperties(value = "clubProducts", allowSetters=true)
    private Product product;
...

ClubProductRepository类:

public interface ClubProductRepository extends JpaRepository<ClubProduct, ClubProductKey> {
    public List<ClubProduct> findByClubProductKeyClub(Club club);
    public List<ClubProduct> findByClubProductKeyProduct(Product product);
}

我尝试这样保存clubProduct:

@Service
public class ClubProductServiceImp implements ClubProductService {
    @Autowired
    private ClubProductRepository clubProductRepository;
    ...
    ClubProduct savedClubProduct = clubProductRepository.save(clubProduct);
    return savedClubProduct;
}

但是,我发现clubProduct未保存在club或产品实体的clubProducts列表中,该列表为null。我是否必须添加club.getClubProducts.add(clubProduct)之类的行,或者是否有其他方法可以使其自动添加?

谢谢。

1 个答案:

答案 0 :(得分:2)

您的Club类中的@OnetoMany映射使用属性mappedby,这意味着它表示负责处理该映射的关系的拥有方。但是,我们仍然需要使双方同步,否则,我们将破坏域模型关系的一致性,除非双方正确同步,否则不能保证实体状态转换正常工作。

答案是肯定的,您必须自己管理Java关系,以便clubProducts持久存在。您正在使用存储库类club的实例来持久存储数据,因此,应添加一个setter方法,如:

  public void addClubProduct(ClubProduct clubProduct) {
     if (clubProduct!= null) {
        if (clubProduct== null) {
            clubProduct= new ArrayList<ClubProduct>();          
        }
        clubProducts.add(clubProduct);
        clubProduct.setClubProduct(this);
     }
  }

也是一种从列表中删除它并在代码中使用这些方法以在启动save之前将值正确设置为列表的方法。阅读related article