【问题标题】:Backward compatibility of @orderColumn: hibernate@orderColumn 的向后兼容性:hibernate
【发布时间】:2018-11-29 10:35:33
【问题描述】:

我有 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。在这种情况下,它只为孩子返回一条记录。

请提出建议。

【问题讨论】:

  • OrderItem 表中有 creation_date 列吗?如果是,您可以使用@OrderBy("creation_date") 订购而无需添加列
  • 不,我不知道。这就是为什么必须使用 orderColumn。

标签: java hibernate spring-boot jpa


【解决方案1】:

你有两个解决方案:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多