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

时间:2019-05-14 22:53:09

标签: java hibernate ejb jpa-2.0

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

%XXX_ROOT%

实体本身是:

@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;
    }

}

persist方法可以正常工作:

@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);

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

当主键为Long且具有GenerationType.IDENTITY时,该行将正确更新,并且可以按预期工作。

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

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

1 个答案:

答案 0 :(得分:1)

您确定MySql生成UUID时,persist是否按预期工作?实体的ID是否与插入数据库的ID相同?