对于我的一个实体,我想使用 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/