0

Есть 2 сущности: Order.java

@Entity
@Table(name = "orders")
public class Order {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private int id;

@Column(name = "price")
private int price;

@ManyToMany(mappedBy = "orders",
        fetch = FetchType.LAZY,
        cascade= CascadeType.ALL
)
private Set<Master> masters;

@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name = "garage_id")
private Garage garage;

@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name = "client_id")
private Client client;

........... 
}

и

Master.java

Entity
@Table(name = "masters")
public class Master extends Person {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private int id;

@ManyToOne(targetEntity = Order.class,
        fetch = FetchType.LAZY
)
@JoinColumn(name = "current_order_id")
private Order currentOrder;

@ManyToMany(mappedBy = "masters",
        fetch = FetchType.LAZY
)
private Set<Garage> garage;

@ManyToMany(fetch = FetchType.LAZY,
        cascade = CascadeType.ALL)
@JoinTable(name = "orders_and_masters",
        joinColumns = @JoinColumn(name = "master_id"),
        inverseJoinColumns = @JoinColumn(name = "order_id")
)
private Set<Order> orders = new HashSet<>();

.................
}

Если сделать update заказа, то сет с мастерами не изменится. Также, если сделать update мастера, то currentOrder тоже не изменится. Ошибка, я думаю, в связях. Ибо передаю правильно и в дебаге прямо перед выполнением update, у сущности все поля правильно изменились, даже сет с мастерами у заказа. Остальные поля, то есть Garage, Client обновятся и с ними всё хорошо.

ImmRaytal
  • 411
  • https://ru.stackoverflow.com/questions/1117153/many-to-many-java-spring?noredirect=1#comment1928903_1117153 – Antonio112009 May 08 '20 at 18:56
  • @Antonio112009 я может быть плохо вас понял, но вы предлагаете ознакомится со статьёй и переписать всё? – ImmRaytal May 08 '20 at 19:10
  • @Antonio112009, я сейчас заметил, что у мастера currentOrder как ManyToOne замаппен, так что пробелма не в ManyToMany – ImmRaytal May 08 '20 at 19:15
  • Set<> лучше не использовать. Читать тут - https://thorben-janssen.com/hibernate-tips-how-to-avoid-hibernates-multiplebagfetchexception/ – Antonio112009 May 08 '20 at 19:37
  • 2 - у вас нету рекурсии объектов. Вам в программе надо указать, что Мастер ссылается на Ордер, а Ордер - на мастерс. читать это - https://vladmihalcea.com/the-best-way-to-use-the-manytomany-annotation-with-jpa-and-hibernate/ – Antonio112009 May 08 '20 at 19:41
  • А в ссылке, которую я скинул - это пример того как надо правильно реализовывать – Antonio112009 May 08 '20 at 19:42
  • @Antonio112009, Я использовать Set<> начал, чтобы можно было без проблем лениво тянуть из базы сразу несколько связанных коллекций – ImmRaytal May 08 '20 at 19:48
  • @Antonio112009 как раз после этой ссылки всё и переписал на Set<>, в статье :You can avoid the MultipleBagFetchException by using a Set instead of a List. – ImmRaytal May 08 '20 at 19:50
  • Я ошибся статьей. То, что я скинул - за 2013 год. Вот за 2019 - https://vladmihalcea.com/hibernate-multiplebagfetchexception/ – Antonio112009 May 09 '20 at 01:02
  • https://stackoverflow.com/a/58825218 – Antonio112009 May 09 '20 at 01:16
  • @Antonio112009, как я понял из прочитанного, Set<> всё равно порождает декартово произведение записей(но почему?) и потому при запросе нужно использовать несколько запросов. Это дороже, но вроде как правильнее. Но это разве мой случай? При get у меня нормально всё приходит, а при update ничего в логи не пишет, обновляет как надо другие сущности, но не мастера и заказ(и их общие поля) – ImmRaytal May 09 '20 at 07:24
  • @Antonio112009, я не создаю записей с дополнительными сущностями. Я вначале заполняю примитивные поля, а потом через update сетаю энтити. То есть я создаю мастеров(на каждого запрос), клиента, пустой заказ. Далее через update отправляю Dto заказа, где любые связанные сущности заменены на Integer и Set<Integer>.Потом нахожу ранее созданный заказ по id, делаю доп. запросы чтобы достать нужных мастеров и клиента и просто сетаю в заказ. А заказ отправляю в entityManager.update(order). Никаких дубликатов, так почему не обновляется? – ImmRaytal May 09 '20 at 07:49

0 Answers0