当使用 PostgreSQL Dialects 时,这是 UUID mapping 的默认值。参见 org.hibernate.dialect.PostgreSQL82Dialect.contributeTypes(TypeContributions, ServiceRegistry) 中的 typeContributions.contributeType( PostgresUUIDType.INSTANCE );
PostgreSQL JDBC driver 将 UUID 映射到 OTHER 。参见 org.hibernate.type.PostgresUUIDType.PostgresUUIDSqlTypeDescriptor.getSqlType() 中的 return Types.OTHER;
注意, PostgreSQL JDBC driver 将很多类型都映射为 OTHER 。
package org.example.demo.hibernate;
import java.util.UUID;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Persistence;
public class Test {
public static void main(String[] args) throws Exception {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("test");
EntityManager em = factory.createEntityManager();
Product product = new Product();
product.no = UUID.randomUUID();
em.getTransaction().begin();
em.persist(product);
em.getTransaction().commit();
em.clear();
Product p = em.find(Product.class, product.id);
// c8d7b4b9-9f6e-44b0-81aa-8c19685fe3f0
System.out.println(p.no);
em.close();
factory.close();
}
@Entity(name = "Product")
public static class Product {
@Id
@GeneratedValue
Integer id;
UUID no;
}
}
生成的 SQL
drop table if exists Product cascade
drop sequence if exists hibernate_sequence
create sequence hibernate_sequence start 1 increment 1
create table Product (id int4 not null, no uuid, primary key (id))
select nextval ('hibernate_sequence')
insert into Product (no, id) values ('c8d7b4b9-9f6e-44b0-81aa-8c19685fe3f0', 1)
select test_produ0_.id as id1_0_0_, test_produ0_.no as no2_0_0_ from Product test_produ0_ where test_produ0_.id=1