gpt4 book ai didi

java - 当主键为 UUID 时,JPA 2 合并是插入而不是更新

转载 作者:行者123 更新时间:2023-12-02 09:53:59 24 4
gpt4 key购买 nike

对于我的一个实体,我想使用 UUID 作为主键而不是 Long。实体扩展 AbstractEntityUUID:

@MappedSuperclass
public abstract class AbstractEntityUUID implements Serializable {

private static final long serialVersionUID = 40076842287035126L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private UUID id;

public UUID getId() {
return id;
}

@Override
public int hashCode() {
if (getId() != null) {
return getId().hashCode();
}
return super.hashCode();
}

@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
AbstractEntityUUID other = (AbstractEntityUUID) obj;
if (getId() == null || other.getId() == null) {
return false;
}
if (!getId().equals(other.getId())) {
return false;
}
return true;
}

}

实体本身是:

@Entity
@Table(schema = "schemaName", name = "order")
@DynamicUpdate
public class Order extends AbstractEntityUUID {

private static final long serialVersionUID = 6358231835578038565L;

@Column(precision = 10, scale = 2)
protected BigDecimal itemPrice;

@Temporal(TIMESTAMP)
@Basic(fetch = LAZY)
protected Date purchaseDate;

// other properties and getters & setters ...

}

持久化方法工作正常:

Order order = new Order();
order.setItemPrice(BigDecimal.ONE);
order = getEM().persist(order);

使用正确的信息在数据库表上创建一个新行。当稍后进行合并时,就会出现问题:

order.setPurchaseDate(new Date());
order = getEM().merge(order);

前一行似乎保持不变,并使用包含价格和日期的新主键创建新行。

当主键为 Long 且 GenerationType.IDENTITY 时,行会正确更新,并且按预期工作。

它在 WildFly 16 服务器上的 ejb 3 bean 上运行。 Hibernate 实现似乎是 5.3.9。数据库是MySQL服务器5.7。

如果 Java 生成 UUID 值就很好,我宁愿不更改它,除非需要使实体使用 UUID 作为主键。

最佳答案

当 MySql 生成 UUID 时,您确定持久性按预期工作吗?实体的id与插入数据库的id是否相同?

关于java - 当主键为 UUID 时,JPA 2 合并是插入而不是更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56139641/

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