对于我的一个实体,我想使用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作为主键。
答案 0 :(得分:1)
您确定MySql生成UUID时,persist是否按预期工作?实体的ID是否与插入数据库的ID相同?