Java 持久化对象不会持久化其所有关系对象
我有三个实体,它们的关系如下:Java 持久化对象不会持久化其所有关系对象,java,hibernate,jpa,Java,Hibernate,Jpa,我有三个实体,它们的关系如下: 客户和订单:一对多 订单和物品:一对多 以下是我的Java类: @Entity @Table public class Order implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "or
- 客户和订单:一对多
- 订单和物品:一对多
@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;
}
@实体
@桌子
公共类顺序实现可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“order\u id”)
私人长id;
@多通(级联=级联类型.ALL)
@JoinColumn(name=“customer\u id”,null=false)
私人客户;
@OneToMany(mappedBy=“订单”)
私有列表有序文章;
}
@实体
@桌子
公共类Customer实现了可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“customer\u id”)
私人长id;
@OneToMany(mappedBy=“客户”)
私人名单订单;
}
@实体
@桌子
公共类文章实现了可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“article\u id”)
私人长id;
@多通(级联=级联类型.ALL)
@JoinColumn(name=“order\u id”,null=false)
私人秩序;
}
然后我将订单保存到数据库中:
Customer customer = createCustomer()
List<Article> articles = createArticles();
Order order = new Order(customer, articles)
entityManager.persist(order);
Customer=createCustomer()
List articles=createArticles();
订单=新订单(客户、物品)
entityManager.persist(顺序);
订单和客户成功地保存了下来,但奇怪的是,这篇文章没有保存下来。谁能帮我一下我做错了什么?我如何打一个电话来维持订单,同时客户和商品也将保持一致
多谢各位 试试改变
@OneToMany(mappedBy = "order")
private List<Article> orderedArticles;
@OneToMany(mappedBy=“order”)
私有列表有序文章;
到
@OneToMany(mappedBy=“order”,cascade=CascadeType.ALL)
私有列表有序文章;
@实体
@桌子
公共类顺序实现可序列化{
@OneToMany(mappedBy=“order”,cascade=CascadeType.ALL)
私有列表@OneToMany
。因此,如文档所述:
每当形成双向关联时,应用程序开发人员必须确保双方始终同步
例如,订单
实体应具有以下方法:
@实体
@桌子
公共类顺序实现可序列化{
@OneToMany(mappedBy=“order”,cascade=CascadeType.ALL)
私有列表有序文章;
公共无效附加条款(第条){
订购物品。添加(物品);
第条.设定顺序(本条);
}
公共无效清除条款(第条){
订购物品。移除(物品);
第条.设置顺序(空);
}
}
使双向关联订单-项目同步。应对客户-订单关联进行相同的更正
假设您的订单
和客户
实体具有适当的助手方法,持久化的有效示例如下所示:
Article article1=新文章();
// ...
第2条=新条款();
// ...
订单=新订单();
命令.添加条款(第1条);
命令.添加条款(第2条);
客户=新客户();
customer.addOrder(订单);
entityManager.persist(客户);
因此,您应该从创建文章开始,然后将它们添加到订单中,然后添加订单到客户实体,然后持久化客户。由于使用了级联类型。所有
所有子实体也将持久化。嗨,Alex,谢谢你的建议。我按照你的建议做了,但得到了一个例外:11:07:00065信息:插入到客户(客户id)值(?)11:07:00070信息:插入到订单(客户id,订单id)值(?),11:07:00076信息:插入到文章(订单id,文章id)值(?),11:07:00078警告SQL错误:0,SQLState:23502 11:07:00078错误:列“订单id”中的空值违反非空约束。详细信息:失败行包含(3,空).你知道吗?可能是由于文章引起的。Order.orderId
为空,对不起,我不确定这一点,也许你应该先保留订单,然后获取订单ID并将其设置到文章中。嗨,SternK,谢谢你的回答。我按照你的建议做了。这意味着在保留订单之前,我调用了addArticle()在订单上和在客户上添加订单:客户客户=创建客户();列表文章=创建文章();订单订单=新订单(客户,文章);订单.addArticle(文章);客户.addOrder(订单);entityManager.persist(订单);但我还是遇到了一个例外:试图保存一个或多个与未保存的临时实体具有不可为空关联的实体。看来持久化的顺序很重要。你知道吗?
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
private List<Article> orderedArticles;