首页 > 解决方案 > @orderColumn 的向后兼容性:hibernate

问题描述

我有 2 个具有 oneToMany 关系的实体。我想维护子实体的插入顺序。我为此使用了@orderColumn。代码:

家长班:

@Entity
public class Order{

  private String orderId;

  @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
  @NotEmpty
  @OrderColumn
  private List<OrderItem> orderItems = new ArrayList<>();
}

儿童班:

@Entity
public class OrderItem{

  @Id
  private String orderItemId;
  @ManyToOne
  @JoinColumn(name = "order_id", nullable = false)
  private Order order;  
}

我在这里面临的问题是 orderColumn 不向后兼容。即它在子表中添加一个名为“order_item_order”的列。它适用于在此更改后创建的记录,但对于以前的记录,该列为空,并导致以下异常:

org.hibernate.HibernateException: null index column for collection 

我尝试将列的默认值设置为 0。在这种情况下,它只返回一个孩子的记录。

请提出建议。

标签: javahibernatespring-bootjpa

解决方案


你有两个解决方案:

  • 继续,@OrderColumn但用正确的值填充它:索引从 0 开始,递增 1(迁移您的数据,这要归功于 sql 脚本或从 java 的两步迁移)
  • 继续@OrderBy注释:添加一creation_date列,在存储对象时填充它(如在create(ModelClass model)存储库的方法中)并将其设置为过去的默认值

推荐阅读