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

我有三个实体,它们的关系如下:

  • 客户和订单:一对多
  • 订单和物品:一对多
以下是我的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;
}
@实体
@桌子
公共类顺序实现可序列化{
私有静态最终长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;