2011-02-26 30 views
17

Tôi đang cố gắng lưu giữ một đối tượng vào cơ sở dữ liệu. Tiếp tục nhận được 'Cột ID không thể chấp nhận lỗi giá trị null'. Mục đích của tôi trông như thế này:@GeneratedValue (strategy = GenerationType.AUTO) không hoạt động như ý nghĩ

@Entity 
public class TestTable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer id = 0; 

    @Column(nullable=false, length=256) 
    private String data = ""; 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public String getData() { 
     return data; 
    } 

    public void setData(String data) { 
     this.data = data; 
    } 

} 

tôi kiên trì chức năng:

public static synchronized boolean persistObject(Object obj){ 
     boolean success = true; 
     EntityManager em = null; 
     EntityTransaction tx = null; 
     try{ 
      em = getEmf().createEntityManager(); 
      tx = em.getTransaction(); 
      tx.begin(); 
      em.persist(obj); 
      tx.commit(); 

     } catch (Exception e){ 
      success = false; 
     } finally{ 
      try{ 
       em.close(); 
      } catch(Exception e){ 
       //nothing 
      } 
     } 
     return success; 
    } 

Trả lời

19

Bạn có thể sử dụng GenerationType.TABLE. Bằng cách đó, jpa sử dụng một bảng tuần tự để xác định id và bạn có thể không bao giờ cần phải tạo ra các giá trị chuỗi hoặc tự động tăng hoặc trình kích hoạt làm giảm tính di động.

Cũng lưu ý rằng trong loại int java được bắt đầu với 0 mặc định, vì vậy bạn cũng có thể loại bỏ điều đó.

+0

@Null: Sau đó chấp nhận câu trả lời (bằng cách nhấp vào dấu kiểm bên cạnh nó) để cguler nhận được một phần thưởng nhỏ để cung cấp nó. Làm như vậy cũng giúp khuyến khích người khác trả lời các câu hỏi khác của bạn tốt. –

+1

@cguler Điều này cũng làm việc cho tôi, nhưng tôi không biết tại sao GenerationType.Table hoạt động và Auto thì không. Bạn có thể giải thích cho tôi hoặc giới thiệu tôi không? –

+2

@ChristianVielma điểm là, AUTO mặc định là IDENTITY. Bạn có thể cần phải thử GenerationType.IDENTITY một cách rõ ràng và xem nó hoạt động để xem nếu nó là một vấn đề với thiết lập AUTO. Nhưng có lẽ cấu hình db của bạn không hỗ trợ nó. Tuy nhiên GenerationType.TABLE tạo ra một bảng và sử dụng nó để tạo ra các phím và thiết lập này sẽ làm việc trên tất cả các rdbms. Hy vọng điều này sẽ giúp :) –

0

Hoặc thử với @GeneratedValue(strategy = GenerationType.AUTO) thay vì @GeneratedValue(strategy = GenerationType.SEQUENCE).

+2

hoặc thử @Id @GeneratedValue (strategy = GenerationType.IDENTITY) –

2

Tôi gặp sự cố với một biểu hiện tương tự như của bạn. Cuối cùng tôi phát hiện ra rằng cấu hình kết nối cơ sở dữ liệu của tôi đã sai: Tôi đã kết nối với một cơ sở dữ liệu cũ có lược đồ không chính xác. Giản đồ mới tuyên bố cột chính-key như

"ID" BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1)

nên the database itself automatically generated the primary key trong khi schema cũ tuyên bố nó như

"ID" INTEGER NOT NULL

Hibernate thực thi mã đúng cho lược đồ mới, không thành công trên lược đồ cũ vì t lược đồ cũ của anh ta yêu cầu SQL INSERT cung cấp một giá trị cho cột ID.

1

Hibernate không theo cách im lặng và bí ẩn khi cột ID là Int. Hãy thử thay đổi nó thành Long trong mã và số nguyên 64 bit không dấu trong cơ sở dữ liệu. Điều đó đã khắc phục vấn đề cho tôi.

4

Trong trường hợp của tôi đó là tiếng địa phương về Nhược điểm:

hibernate.dialect=org.hibernate.dialect.H2Dialect 

thay vì:

hibernate.dialect=org.hibernate.dialect.PostgreSQL9Dialect 

khi tôi chuyển sang cơ sở dữ liệu sản xuất. Hibernate đã cố gắng sử dụng chiến lược chuẩn bị cho công cụ db khác nhau.

Các vấn đề liên quan