2010-01-06 31 views
63

Tôi có một ứng dụng j2ee sử dụng ngủ đông với chú thích. Làm cách nào để chú thích trường Id trong lớp pojo của tôi để đặt nó thành tăng tự động hoặc được tạo tự động. và trong việc thêm đậu, tôi có để lại trường đó trong bean của tôi không?Hibernate Auto Increment ID

Trả lời

122
@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
private int id; 

và bạn để nó null (0) khi kiên trì. (null nếu bạn sử dụng Integer/Long wrappers)

Trong một số trường hợp, các chiến lược AUTO được giải quyết để SEQUENCE Rathen hơn để IDENTITY hoặc TABLE, vì vậy bạn có thể muốn tự thiết lập nó để IDENTITY hoặc TABLE (tùy thuộc vào cơ sở dữ liệu cơ bản).

Có vẻ như SEQUENCE + chỉ định tên trình tự phù hợp với bạn.

+0

id của tôi là loại chuỗi. những gì tôi sẽ đặt cho nó. Bởi vì tôi nhận được lỗi này. Gây ra bởi: javax.el.ELException: org.hibernate.exception.SQLGrammarException: không thể nhận được giá trị chuỗi tiếp theo – cedric

+3

autoincrement nghĩa là số đó được tăng lên. Không thể tăng chuỗi. Làm cho cột int – Bozho

+0

cột myid trong cơ sở dữ liệu là số kiểu. Và tôi đã thay đổi id của tôi trong pojo của tôi thành int. tôi nhận được chuỗi lỗi không tồn tại – cedric

4

Nếu bạn có cột số mà bạn muốn tự động tăng, có thể là tùy chọn để đặt trực tiếp columnDefinition. Điều này có lợi thế, rằng lược đồ tự động tạo ra giá trị ngay cả khi nó được sử dụng mà không ngủ đông. Điều này có thể làm cho mã của bạn db cụ thể mặc dù:

import javax.persistence.Column; 
@Column(columnDefinition = "serial") // postgresql 
28

Làm điều đó như sau: -

@Id 
@GenericGenerator(name="kaugen" , strategy="increment") 
@GeneratedValue(generator="kaugen") 
@Column(name="proj_id") 
    public Integer getId() { 
    return id; 
} 

Bạn có thể sử dụng bất kỳ tên tùy ý thay vì kaugen. Nó làm việc tốt, tôi có thể thấy bên dưới các truy vấn trên console

Hibernate: select max(proj_id) from javaproj 
Hibernate: insert into javaproj (AUTH_email, AUTH_firstName, AUTH_lastName, projname,   proj_id) values (?, ?, ?, ?, ?) 
+0

Cái này phù hợp với tôi. Nhưng nó không cho phép tôi đặt giá trị ID. Tôi đã cố gắng setID với số nguyên hoặc int, nhưng nó sử dụng tối đa bất cứ lúc nào. Tôi nên làm gì? – desudesudesu

+0

sử dụng @GenericGenerator (tên = "incrementId", chiến lược = "được giao") @GeneratedValue (generator = "incrementId") .Nó sẽ cho phép bạn đặt id theo cách của riêng bạn.Nhưng nếu bạn không chuyển id thì nó sẽ là 0 –

+0

@Kaushik Lele Có phải chiến lược = "tăng" hibernate sẵn sàng tăng cường stratergy? Có phải là nó thuộc về các SEQUENCE, IDENTITY, AUTO, TABLE? –

6

FYI

Sử dụng netbeansLớp học New Entity từ cơ sở dữ liệu với một mysql * auto_increment * cột, tạo cho bạn một thuộc tính với các chú thích sau:

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Basic(optional = false) 
@Column(name = "id") 
@NotNull 
private Integer id; 

Điều này khiến tôi giống nhau n lỗi nói rằng cột không được rỗng, vì vậy tôi chỉ đơn giản là loại bỏ các anotation @NotNull để lại các thuộc tính null, và nó hoạt động!

6

Hibernate định nghĩa năm loại chiến lược thế hệ nhận dạng:

AUTO - một trong hai cột sắc, chuỗi hoặc bảng tùy thuộc vào DB cơ bản

TABLE - Bàn giữ id

IDENTITY - cột nhận dạng

SEQUENCE - chuỗi

sắc copy - bản sắc được sao chép từ một thực thể

Ví dụ sử dụng Bảng

@Id 
@GeneratedValue(strategy=GenerationType.TABLE , generator="employee_generator") 
@TableGenerator(name="employee_generator", 
       table="pk_table", 
       pkColumnName="name", 
       valueColumnName="value",        
       allocationSize=100) 
@Column(name="employee_id") 
private Long employeeId; 

để biết thêm chi tiết, kiểm tra link.

+1

Xin lỗi, Liên kết đã hết hạn ... –

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