The side without mappedBy owns the foreign key. Updating only the inverse side writes nothing.
@Entity class Order {
@OneToMany(mappedBy = "order") // inverse side
List<OrderItem> items = new ArrayList<>();
void addItem(OrderItem i) { // keep BOTH sides in sync
items.add(i);
i.setOrder(this);
}
}
@Entity class OrderItem {
@ManyToOne @JoinColumn(name = "order_id") // owning side
Order order;
}
items.add(item) alone -> no SQL, the FK is never set.
addItem(item) -> insert into order_items (order_id, ...) values (?, ...)
Run this yourself in the Online Java Compiler, spin up a live REST API in the API Sandbox, or practise with Java interview questions.
Published 2026-08-11