Используя аннотации JPA и режим гибернации, мы недавно столкнулись с проблемой с однонаправленным сопоставлением onetomany, которое выглядело следующим образом:
@Entity
public class FooOrder extends AbstractEntity{
@OneToMany(cascade= CascadeType.ALL,orphanRemoval = true)
@JoinColumn(name = "fooOrderId")
private List<FooItem> fooItems = new ArrayList<FooItem>();
public void addFooItem(foo item properties here)
{
fooItems.add(fooItem);
}
}
@Entity
public class FooItem extends AbstractEntity {
SomeRandomStuffButNoLinkToParent
}
Код теста был в основном таким:
FooOrder fooOrder = new FooOrder(stuff here);
fooOrder.addFooItem(foo item properties here);
fooOrder = fooOrderRepository.save(fooOrder);
Когда мы запускаем тесты на этом, мы получаем sql, который выглядит примерно так:
insert FooOrder(columns here)
insert FooItem(columns here missing the FK to FooOrder)
update FooItem set FooOrderFK to proper key.
но если я установлю @JoinColumn(name = "activeOrderId", nullable = false)
, то мой sql будет выглядеть примерно так:
insert FooOrder(columns here)
insert FooItem(columns here with FK to FooOrder)
Почему спящий режим устанавливает FK через обновление, если оно может быть обнулено, но устанавливает его во вставке, когда оно не может быть обнулено?