java - 针对 MySQL 在 Hibernate 实体中建模 UUID

标签 java mysql hibernate jpa uuid

我有一个与 this one 非常相似的问题,但是我的问题比那个问题更基本,所以我不觉得它是一个骗局......(我们会看看SO的想法)。 并且如果它是另一个问题的欺骗,请向我指出(也许在评论中)接受的答案如何完全回答/解决我的问题(我不我认为确实如此!)。


我有一个 Java/JPA/Hibernate @Entity 类,需要有一个 UUID 字段:

@Canonical
@MappedSuperclass
public abstract class BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private UUID refId;

    // Getters/setters/ctors/etc.
}

@Entity(name = "accounts")
@AttributeOverrides({
    @AttributeOverride(name = "id", column=@Column(name="account_id")),
    @AttributeOverride(name = "refId", column=@Column(name="account_ref_id"))
})
public class Account extends BaseEntity {
    // blah whatever
}

也就是说,我需要在应用程序层使用 UUID。然而这里的数据库是 MySQL,在 MySQL 中表示 UUID 的压倒性建议似乎是将它们表示为 VARCHAR(36),所以这就是我所拥有的。

在运行时我遇到以下异常:

Caused by: org.hibernate.HibernateException: Wrong column type in my_db.accounts for column account_ref_id. Found: varchar, expected: binary(255)
    at org.hibernate.mapping.Table.validateColumns(Table.java:373)
    at org.hibernate.cfg.Configuration.validateSchema(Configuration.java:1338)
  <rest of stack trace omitted for brevity>

很明显,数据库显示的是 VARCHAR(36),但 Hibernate 似乎默认需要 binary(255) .

老实说,我并不关心 UUID 在数据库中存储的内容。它可以是 VARCHAR,它可以是 TEXT,它可以是 BLOB...它可以是我所关心的 toastr !但这里的基本要求是数据模型(实体类)使用UUID

这里有什么解决办法?如果我必须更改数据库中的列类型,我应该将类型更改为什么?如果我必须更改/修改实体中的 UUID 字段,我还需要用什么来注释它?

最佳答案

对我来说,修复需要更改数据库架构以及实体(Java)代码。

首先,我更改了 CREATE TABLE 语句以使用 BINARY(255) 而不是 VARCHAR(36):

CREATE TABLE IF NOT EXISTS accounts (
    # lots of fields...

    account_ref_id BINARY(255) NOT NULL,

    # ...lots of other fields
);

接下来,我将 @Type(type="uuid-binary") 添加到实体中的字段声明中:

@Canonical
@MappedSuperclass
public abstract class BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Type(type="uuid-binary")
    private UUID refId;

    // Getters/setters/ctors/etc.
}

@Entity(name = "accounts")
@AttributeOverrides({
    @AttributeOverride(name = "id", column=@Column(name="account_id")),
    @AttributeOverride(name = "refId", column=@Column(name="account_ref_id"))
})
public class Account extends BaseEntity {
    // blah whatever
}

这对我来说效果很好。

关于java - 针对 MySQL 在 Hibernate 实体中建模 UUID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43394039/

相关文章:

php - 登录只是刷新页面 php html

mysql - 在 SQL 查询中获取几个不同的计数

java - Hibernate 与 MySQL 插入查询不一致

java - 添加子表计数以使用 hibernate criteria API 从父表中选择

java - 如何优化周期?

java - 在 GATE 中创建新注释集

java - 如何使用xlink序列化xml标签:href

java - 是否有任何标准的 'gettable' Java 接口(interface)?

php - 如何更新我的查询以符合启用的 sql_mode=only_full_group_by?

java - JPA/Hibernate如何映射代表 "application properties"的bean