JPA与回退值的关系

时间:2018-02-05 13:34:52

标签: java hibernate jpa

我正在使用JPA和Hibernate。

我有这些表格:

ORDER
----------------------------
ID | COL A | COL B | COL C |
 1 |       |       |       |
 2 |       |       |       |

ORDER_FLOW
----------------------------
ID | ORDER_ID | ...........|
 1 |     NULL | ...........|
 2 |        1 | ...........|

我想生成一个映射,以便第一个订单(order.id = 1)引用第二个order_flow(order_flow.id = 2),第二个订单(order.id = 2)回退到第一个order_flow因为NULL FK。

基本上我想映射到默认的order_flow记录,如果不存在特定的记录。

这是不可能的映射吗?有人可以提出更好的方法吗?

提前致谢!

2 个答案:

答案 0 :(得分:0)

您可以通过以下方法之一来完成:

  1. 在DB中触发(可能会破坏您的JPA代码)
  2. 实体中的默认值和DB中的默认链接。
  3. 第一个是容易理解的,所以让我们谈谈第二个。我不确定它是否真的有效,但我认为它可能。因此,您在DB中设置默认值,如果第一个实体在没有附加实体的情况下保存,它将获得默认的第二个实体ID,反之亦然。

    此外,您可能需要@DynamicInsert注释才能在非可空fk列上明确保存null。

答案 1 :(得分:0)

也许我找到了一个解决方案,不知道它是否会破坏某些东西......

@Entity
public class Order {
    @Id
    @GeneratedValue(generator = "uuid2")
    @GenericGenerator(name = "uuid2", strategy = "uuid2")
    @Column(columnDefinition = "BINARY(16)")
    private UUID id;

    @ManyToOne
    @JoinFormula("(SELECT of.id FROM order_flow of WHERE of.order_id = id OR of.order_id is null order by of.order_id desc LIMIT 1)")
    private OrderFlow orderFlow;
}
@Entity
public class OrderFlow {
    @Id
    @GeneratedValue(generator = "uuid2")
    @GenericGenerator(name = "uuid2", strategy = "uuid2")
    @Column(columnDefinition = "BINARY(16)")
    private UUID id;

    @OneToOne
    private Order order;