我有一个与 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/