gpt4 book ai didi

java - 更改Hibernate中一对多单向关系中的外键约束名称

转载 作者:行者123 更新时间:2023-11-30 06:25:02 27 4
gpt4 key购买 nike

我使用的是 Hibernate 版本 5.2.10。

这是我在 Order 实体中的关系:

@Entity
public class Order {

@Id
@Column(name = "ID", length = 22)
private String id;

@OneToMany(mappedBy = "orderId", cascade = CascadeType.ALL, orphanRemoval = true)
private List<OrderLine> lines;

}

OrderLine 中我有:

@Entity
public class OrderLine {

@Id
@Column(name = "ID", length = 22)
private String id;

@Column(name = "ORDER_ID", nullable = false, length = 22)
private String orderId;

}

一切工作正常,但现在我想更改数据库 FK 约束的名称,所以:

顺序(现在我使用@JoinColumn而不是“mappedBy”):

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "ORDER_ID", foreignKey = @ForeignKey(name = "FKNAME"))
private List<OrderLine> lines;

订单行:

@Column(name = "ORDER_ID", nullable = false, length = 22)
private String orderId;

在这种情况下,我在删除 Order 时遇到问题,因为 Hibernate 在删除 Order 之前将 orderId 设置为 null OrderLines,违反了非空 orderId 约束。

为了避免这种情况,我必须删除 nullable = false (但我不想!)。

有解决办法吗?使用“mappedBy”时可以更改数据库FK约束的名称吗?

编辑

作为主键标识符,我使用 UUID 版本 4(随机)base64 编码。去掉填充字符后,它的长度正好是 22 个字符。 ID 是在任何实体构建时生成和分配的。但这与我的问题无关。

最佳答案

以下方法似乎有效:

@Entity
public class Orders {
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid")
@Column(name = "ORDER_ID", length = 36)
private String idc;

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "ORDER_ID", foreignKey = @ForeignKey(name = "FK_NAME"))
private List<OrderLine> lines;

...
}

@Entity
public class OrderLine {
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid")
@Column(name = "ORDERLINE_ID", nullable = false, length = 36)
private String orderlineId;
...
}

我使用了 Hibernate 自动生成的 UUID,但想法与你的相同。数据库架构是:

ORDERS                      ORDERLINE
------------ ----------------
ORDER_ID PK --+ ORDERLINE_ID PK
+--FK_NAME-- ORDER_ID FK

删除订单也有效。

<小时/>

更新:对实体的一些操作

OrderLine ol1 = new OrderLine();
OrderLine ol2 = new OrderLine();
OrderLine o13 = new OrderLine();
OrderLine ol4 = new OrderLine();
OrderLine ol5 = new OrderLine();
OrderLine ol6 = new OrderLine();
Orders o1 = new Orders(Arrays.asList(ol1));
Orders o2 = new Orders(Arrays.asList(ol2, o13));
Orders o3 = new Orders(Arrays.asList(ol4, ol5, ol6));

em.begin();
em.persist(o1);
em.persist(o2);
em.persist(o3);
em.commit();

em.begin();
Orders o = p.provider().find(Orders.class, id);
em.remove(o);
em.commit();

关于java - 更改Hibernate中一对多单向关系中的外键约束名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47347102/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com