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

标签 java hibernate ejb jpa-2.0

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

相关文章:

java - 声音不在 android > Ice Cream Sandwich 中播放

java - 修改android内部类/调用处理

java - J2EE Struts、Spring 和 Hibernate 框架问题

java - 需要将控制从 Action 类发送到 JSP

Java spring JPA Repository Entity 未被删除

java - 将 Hibernate 持久对象转换为 SQL Insert 语句

jakarta-ee - EJB 未注入(inject)导致 NullPointerException

java - WELD-00143 伪作用域 bean 具有循环依赖性

java - 为什么这个简单的调度程序不起作用?

java - 用户关键字替换密码在两个不同大小的数组上循环