我正在按照以下关系编写3个表:
俱乐部等级:
@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)
之类的行,或者是否有其他方法可以使其自动添加?
谢谢。
答案 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