当前位置: 首页 > 知识库问答 >
问题:

双向onetomany不更新foriegn密钥[重复]

葛玉堂
2023-03-14
@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();
}

我基于以下示例实现了这一点:https://vladmihalcea.com/the-best-way-to-map-a-onetomany-association-with-jpa-and-hibernate/

共有1个答案

苏君昊
2023-03-14

正如Vlad Mihalcea在他的伟大文章中所解释的那样:...您需要同步双向关联的两端。

对于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);
}
 类似资料:
  • 问题内容: 在SQLAlchemy中有一种优雅的方法吗?我的意思是语法类似于? 问题答案: 现在,仅在MySQL的SQLAlchemy中内置了此功能。somada141的以下答案是最佳解决方案:https ://stackoverflow.com/a/48373874/319066 在SQL语句中 如果希望生成的SQL实际上包含,则最简单的方法涉及使用装饰器。 的代码(来自关于该主题的很好的螺纹连

  • 使用Spring数据REST和Spring数据JPA,我想更新聚合根上的子实体集合。举个例子,假设我有一个实体,它与实体有一对多的关系有自己的Spring数据存储库没有,因为它只能通过访问。 令人讨厌的是,由于现有的数据库设计,有一个复合键,包括的外键。因此,在没有双向关系的情况下,我无法找到将外键作为中复合键的一部分的方法,即使我不需要双向关系。 带有Lombok注释的类如下所示: 和评论: 以

  • 如何使用选项编写原则查询?

  • 我有一个具有两列主键的表。 未捕获的异常“PDOException”,包含消息“SQLSTATE[23000]”:完整性约束违反:1062中键“Primary”的重复项“157-433”... 为什么它不只是更新现有的(157,433)-行?

  • 问题内容: 假设我有两个实体: 然后,我要保留“客户”实体,然后,参照先前添加的“客户”保留“订单”实体。当我从数据库中检索此客户并调用getOrders时,它将返回空集。这是正常行为吗?如果是,当我添加新的Order实体时,我该怎么做以自动刷新此集合? 问题答案: Jpa不会为您维护关系,因此应用程序需要设置双向关系的两端,以使它们与数据库保持同步。当您设置了order-> customer关系

  • 问题内容: 我没有看到重复的约束。它在哪里? 问题答案: 这很可能是因为您至少命名了一个约束,且其标识符与列相同: 应该为约束使用其他标识符,例如: 和表中的相同: 这些是我看到的仅有的三个,但可能还有其他我想念的。