Проблема добавления Springboot в отношении oneTOMany - PullRequest
0 голосов
/ 26 мая 2020

Я пишу 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 не сохраняется в списке clubProducts в объекте club или product, список пуст. Должен ли я добавлять такие строки, как club.getClubProducts.add(clubProduct), или есть другой способ добавить его автоматически?

Спасибо.

1 Ответ

2 голосов
/ 26 мая 2020

Отображение @OnetoMany в вашем классе Club использует атрибут mappedby, что означает, что он представляет собой принадлежащую сторону отношения, отвечающую за обработку сопоставления. Однако нам по-прежнему необходимо синхронизировать обе стороны. Да, вы должны сами управлять отношениями java, чтобы clubProducts сохранялись. Вы используете экземпляр класса репозитория club для сохранения данных, поэтому вам следует добавить метод установки, например:

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

, а также метод удаления его из списка и использования этого метода в вашем код для правильной установки значений в список перед запуском save. Прочитать статью по теме

...