如何解决持久对象不会持久化其所有关系对象
我有三个具有如下关系的实体:
- 客户和订单:一对多
- 订单和商品:一对多
这是我的Java类:
@Entity
@Table
public class Order implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "order_id")
private long id;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "customer_id",nullable = false)
private Customer customer;
@OneToMany(mappedBy = "order")
private List<Article> orderedArticles;
}
@Entity
@Table
public class Customer implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "customer_id")
private long id;
@OneToMany(mappedBy = "customer")
private List<Order> orders;
}
@Entity
@Table
public class Article implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "article_id")
private long id;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "order_id",nullable = false)
private Order order;
}
然后我将订单持久保存到数据库中
Customer customer = createCustomer()
List<Article> articles = createArticles();
Order order = new Order(customer,articles)
entityManager.persist(order);
订单和客户成功保留,但奇怪的是文章没有。任何人都可以在这里帮助我,我做错了什么?我该如何拨打电话以保留订单,并同时保留客户和商品?
非常感谢您!
解决方法
尝试更改
let site = MGLSymbolStyleLayer(identifier: "site",source: source)
site.iconImageName = NSExpression(forKeyPath: "siteRiskIcon")
到
@OneToMany(mappedBy = "order")
private List<Article> orderedArticles;
,
- 如本article中所述:
级联仅对 Parent – Child 关联有意义( Parent 实体状态转换被级联到其Child实体)。从儿童级联到父母级不是很有用,通常是映射代码的味道。
因此,例如,您的 Order-Article 关联应通过以下方式更正:
@Entity
@Table
public class Order implements Serializable {
@OneToMany(mappedBy = "order",cascade = CascadeType.ALL)
private List<Article> orderedArticles;
}
@Entity
@Table
public class Article implements Serializable {
@ManyToOne // CascadeType.ALL should not be used here
@JoinColumn(name = "order_id",nullable = false)
private Order order;
}
应该对客户-订单关联进行相同的更正。
- 您使用bidirectional
@OneToMany
。因此,正如文档所述:
每当建立双向关联时,应用程序开发人员就必须确保双方始终保持同步。
例如,您的Order
实体应具有以下方法:
@Entity
@Table
public class Order implements Serializable {
@OneToMany(mappedBy = "order",cascade = CascadeType.ALL)
private List<Article> orderedArticles;
public void addArticle(Article article) {
orderedArticles.add(article);
article.setOrder(this);
}
public void removeArticle(Article article) {
orderedArticles.remove(article);
article.setOrder(null);
}
}
使双向关联 Order-Article 处于同步状态。对于 Customer-Order 关联应进行相同的更正。
假设您的Order
和Customer
实体具有适当的辅助方法,则持久化的有效示例如下所示:
Article article1 = new Article();
// ...
Article article2 = new Article();
// ...
Order order = new Order();
order.addArticle(article1);
order.addArticle(article2);
Customer customer = new Customer();
customer.addOrder(order);
entityManager.persist(customer);
因此,您应该从创建文章开始,然后将它们添加到一个或多个订单,然后将您的一个或多个订单添加到客户实体,然后persist
客户。由于使用CascadeType.ALL
,所有子实体也将被保留。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。