Есть 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 обновятся и с ними всё хорошо.
currentOrderкак ManyToOne замаппен, так что пробелма не в ManyToMany – ImmRaytal May 08 '20 at 19:15Set<>лучше не использовать. Читать тут - https://thorben-janssen.com/hibernate-tips-how-to-avoid-hibernates-multiplebagfetchexception/ – Antonio112009 May 08 '20 at 19:37Set<>начал, чтобы можно было без проблем лениво тянуть из базы сразу несколько связанных коллекций – ImmRaytal May 08 '20 at 19:48Set<>, в статье :You can avoid the MultipleBagFetchException by using a Set instead of a List.– ImmRaytal May 08 '20 at 19:50Set<>всё равно порождает декартово произведение записей(но почему?) и потому при запросе нужно использовать несколько запросов. Это дороже, но вроде как правильнее. Но это разве мой случай? Приgetу меня нормально всё приходит, а при update ничего в логи не пишет, обновляет как надо другие сущности, но не мастера и заказ(и их общие поля) – ImmRaytal May 09 '20 at 07:24IntegerиSet<Integer>.Потом нахожу ранее созданный заказ по id, делаю доп. запросы чтобы достать нужных мастеров и клиента и просто сетаю в заказ. А заказ отправляю вentityManager.update(order). Никаких дубликатов, так почему не обновляется? – ImmRaytal May 09 '20 at 07:49