Двунаправленный onetomany не обновляет чужой ключ - PullRequest
0 голосов
/ 14 октября 2018

Я реализовал двунаправленные ассоциации OneToMany с использованием аннотаций гибернации.Ниже приведен мой код:

@Entity
@Table(name="Cart")
public class Cart {

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

  @Column(name="name")
  private String name;

  @OneToMany(cascade=CascadeType.ALL, mappedBy="cart")
  private List<Item> items;
  //getters and setters
}

Ниже приведен класс элементов:

@Entity
@Table(name="Item")
public class Item {

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

  @Column(name="name")
  private String name;

  @ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
  @JoinColumn(name="cart_id")
  private Cart cart;

  //getters and setters
}

Следующий код сохраняет данные:

public static void saveCart(Session session) {
    Transaction tx = session.beginTransaction();

    Cart c1 = new Cart();
    c1.setName("Cart 1");

    Item item1 = new Item();
    item1.setName("item1");

    Item item2 = new Item();
    item2.setName("item2");

    List<Item> items = new ArrayList<Item>();
    items.add(item1);
    items.add(item2);

    c1.setItems(items);

    session.save(c1);
    tx.commit();
}

При этом вставляется одна запись втаблица корзины и 2 записи в таблице предметов.Однако столбец cart_id в таблице элементов не обновляется.Любая идея, почему?

Я реализовал это на основе следующего примера: https://vladmihalcea.com/the-best-way-to-map-a-onetomany-association-with-jpa-and-hibernate/

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

В вашей сущности Cart имя столбца для id должно быть cart_id, потому что в вашем классе Item вы используете его для JoinColumn.Они оба должны иметь одинаковое имя.

0 голосов
/ 14 октября 2018

Как объясняет Влад Михалча в своей замечательной статье: ... вам нужно синхронизировать оба конца двунаправленной ассоциации .

Для вашего случая до session.save(c1); вы должны добавить:

item1.setCart(c1);
item2.setCart(c1);

Или еще лучше создать вспомогательные методы в вашем классе Cart, например:

public void addItem(Item item) {
    items.add(item);
    item.setCart(this);
}

public void removeItem(Item item) {
    items.remove(item);
    item.setCart(null);
}
...