2016-04-10 16 views
8

Tôi đang làm việc trên một dự án web sử dụng:Không thể tạo id UUID cho các tổ chức của tôi

  • Xuân 4.x (Spring Boot 1.3.3)
  • Hibernate 4.x
  • PostgreSQL 9 .x

tôi mới đến Postgres DB và cho các bảng của tôi, tôi quyết định sử dụng (lần đầu tiên) UUID định danh, nhưng tôi đang gặp một số khó khăn ...

Đối với trường ID tôi đã sử dụng loại Postgres uuid và tôi đặt làm giá trị mặc định uuid_generate_v4(). Tất cả đều hoạt động chính xác khi tôi tạo một hàng mới trực tiếp bằng cách chèn PSQL, nhưng tôi không thể tạo bản ghi mới bằng ứng dụng của mình.

Như một ví dụ, đây là cách tôi tuyên bố một thực thể trong ứng dụng của tôi:

@Entity 
@Table(name = "users") 
public class User { 

    @Id 
    @Type(type = "pg-uuid") 
    private UUID id; 

    // other fields and methods... 

} 

Đối với tuyên bố này, tôi đang sử dụng Type Hibernate chú thích.

Tìm hoạt động làm việc tốt, nhưng khi tôi cố gắng để làm cho một chèn tôi nhận được ngoại lệ này:

org.springframework.orm.jpa.JpaSystemException: ids for this class must be manually assigned before calling save(): net.myapp.User;

Followiong this tutorial tôi đã cố gắng để giải quyết vấn đề này. Tôi đã thay đổi định nghĩa thực thể của tôi để:

@Entity 
@Table(name = "users") 
public class User { 

    @GeneratedValue(generator = "uuid2") 
    @GenericGenerator(name = "uuid2", strategy = "uuid2") 
    @Column(columnDefinition = "BINARY(16)") 
    @Id 
    private UUID id; 

    // other fields and methods... 
} 

Nhưng bây giờ tôi nhận được giá trị ID sai khi tôi lấy (hiện có) dữ liệu từ DB (chèn vẫn chưa thử ...).

Vậy cách đúng để xác định trường ID trong trường hợp của tôi là gì?


CẬP NHẬT

Sử dụng định nghĩa thứ hai ...

Khi tôi cố gắng tìm thấy bằng ID, tôi nhận được:

org.postgresql.util.PSQLException: ERROR: operator does not exist: uuid = bytea Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.

Khi tôi cố gắng tạo hồ sơ mới:

org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute statement; SQL [n/a];

+0

Bạn đã cố thêm chỉ '@Id @ GeneratedValue' mà không có' Cột' và 'GenericGenerator'? –

+0

@AliDehghani cảm ơn bạn tôi sẽ thử – davioooh

+0

có, làm việc với uuid ở postgres thông qua ORM luôn luôn là một nỗi đau trong một .. đầu. Tôi đã dành một vài ngày với vấn đề này hai năm trước đây. một vài mẹo: 1. bạn cần uuid kích hoạt trong postgresql (chỉ cần đảm bảo bạn có thể tạo chúng từ console) 2. uuid - bytea lỗi có nghĩa là chèn của bạn là không chính xác và nó lưu id như byte 3. để loại trừ các vấn đề máy phát đầu tiên cố gắng tạo chúng trong java: id = UUID.randomUUID(); – AdamSkywalker

Trả lời

3

Tôi sử dụng cấu hình sau và nó hoạt động. Tôi đang sử dụng Glassfish làm máy chủ ứng dụng.

@Id 
@GenericGenerator(name = "uuid", strategy = "uuid2") 
@GeneratedValue(generator = "uuid") 
@Column(name = "key", unique = true, nullable = false) 
@Type(type="pg-uuid") 
private UUID key; 

Chìa khóa bảng có kiểu Postgres uuid:

CREATE TABLE billuser.billingresult (key uuid NOT NULL, ....)... 
+0

Điều này hoạt động hoàn hảo! Cảm ơn nhiều! – davioooh

0

Làm việc như một nét duyên dáng:

  • Tạo một lớp cấu hình tùy chỉnh

    package mypackage; 
    
    public class PostgresUuidDialect extends PostgreSQL9Dialect { 
    
    @Override 
    public void contributeTypes(final TypeContributions typeContributions, final ServiceRegistry serviceRegistry) { 
        super.contributeTypes(typeContributions, serviceRegistry); 
        typeContributions.contributeType(new InternalPostgresUUIDType()); 
    } 
    
    protected static class InternalPostgresUUIDType extends PostgresUUIDType { 
    
         @Override 
         protected boolean registerUnderJavaType() { 
          return true; 
         } 
        } 
    } 
    
  • Trong application.properties bạn thêm này

spring.jpa.database-platform = mypackage.PostgresUuidDialect

(thay đổi mypackage theo yêu cầu của bạn)

Ưu điểm: bạn không cần phải sử dụng bất kỳ chú thích đặc biệt nào trong thực thể JPA của mình

Nhược điểm: điều này che khuất lớp trong dự án của bạn ...

0

tôi đã sử dụng cấu hình này và điều này đang làm việc cho tôi và Tôi đang sử dụng

  • Xuân Boot 1.5.2
  • Hibernate 5
  • PostgreSQL 9.6

Entity.java

@Id 
@Column(updatable = false, nullable = false, columnDefinition = "uuid DEFAULT uuid_generate_v4()") 
@GeneratedValue(generator = "UUID") 
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator") 
private UUID id; 

trước đó tôi đề nghị bạn tải uuid-ossp nó vào cơ sở dữ liệu của bạn để sử dụng nó.

CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; 
Các vấn đề liên quan