ID tăng dần tự động ngủ đông


86

Tôi có một ứng dụng j2ee sử dụng chế độ 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ó làm tăng tự động hoặc tự động tạo. và khi thêm bean, tôi có để lại trường đó trong bean null không?

Câu trả lời:


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

và bạn rời khỏi nó null( 0) khi kiên trì. ( nullnếu bạn sử dụng Integer/ Longwrappers)

Trong một số trường hợp, AUTOchiến lược được giải quyết thành SEQUENCErathen hơn là IDENTITYhoặc TABLE, vì vậy bạn có thể muốn đặt nó theo cách thủ công thành IDENTITYhoặc TABLE(tùy thuộc vào cơ sở dữ liệu bên dưới).

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


id của tôi thuộc loại chuỗi. những gì tôi sẽ thiết lập 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 giá trị trình tự tiếp theo
cedric

4
autoincrement có nghĩa là nó là một số được tăng dần. Một chuỗi không thể được tăng lên. Đặt cột thành int
Bozho

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

2
Đối với Oracle, SEQUENCE là thứ gần nhất với autoincrement. Bạn phải tạo chuỗi trước trừ khi bạn đang cho phép Hibernate tạo lược đồ của mình. Nếu bạn nghĩ rằng bạn có thể hỗ trợ nhiều cơ sở dữ liệu tại một số điểm, hãy sử dụng TABLE.
Brian Deterling

2
Không sử dụng danh tính, Oracle không hỗ trợ danh tính, nó hỗ trợ trình tự.
JuanZe

33

Thực hiện 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 ý nào thay vì kaugen. Nó hoạt động tốt, tôi có thể thấy các truy vấn bên dưới trên bảng điều khiển

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

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 bằng số nguyên hoặc int, nhưng nó sử dụng max bất cứ lúc nào. Tôi nên làm gì?
desudesudesu

sử dụng @GenericGenerator (name = "incrementId", chiến lược = "được gán") @GeneratedValue (máy phát điện = "incrementId"). Nó sẽ cho phép bạn đặt id của riêng bạn. Nhưng nếu bạn không vượt qua id thì nó sẽ là 0.
Ravi Kant

@Kaushik Lele Có phải chiến lược = "gia tăng" ở chế độ ngủ đông gia tăng sẵn có ở chế độ ngủ đông? Nó nằm dưới SEQUENCE, IDENTITY, AUTO, BẢNG nào sau đây?
cảm thấy tốt và lập trình

Làm thế nào về 700 triệu bản ghi trong bảng? Đây có thể là vấn đề mà không chỉ tôi nghĩ
user2171669

10

FYI

Sử dụng netbeans Lớp thực thể mới từ Cơ sở dữ liệu với cột mysql * auto_increment *, 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 gặp phải lỗi tương tự khi nói rằng cột không được rỗng, vì vậy tôi chỉ cần xóa chú thích @NotNull để lại thuộc tính là null và nó hoạt động!


7

Hibernate xác định năm loại chiến lược tạo mã nhận dạng:

AUTO - cột nhận dạng, chuỗi hoặc bảng tùy thuộc vào DB bên dưới

TABLE - bảng chứa id

IDENTITY - cột nhận dạng

SEQUENCE - trình tự

bản sao danh tính - danh tính được sao chép từ một thực thể khác

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, hãy kiểm tra liên kết .


4

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

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

MySQL là @Column (columnDefinition = "integer auto_increment")
yeralin

1

Trong trường hợp ai đó "đụng" vào câu hỏi SO này để tìm kiếm các chiến lược cho bảng Informix khi PK là kiểu Serial .

Tôi đã thấy rằng điều này hoạt động ... như một ví dụ.

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "special_serial_pk")
private Integer special_serial_pk;

Để điều này hoạt động, hãy đảm bảo khi bạn thực hiện session.SaveOrUpdate bạn chuyển giá trị cho cột special_serial_pk NULL .

Trong trường hợp của tôi, tôi thực hiện một BÀI ĐĂNG HTML với JSON như vậy ...

{
"special_serial_pk": null, //<-- Field to be incremented
"specialcolumn1": 1,
"specialcolumn2": "I love to code",
"specialcolumn3": true
}

0

Sử dụng netbeans Các lớp thực thể mới từ Cơ sở dữ liệu với cột tự động_tự_động_của_mai , tạo cho bạn một thuộc tính với hibernate.hbm.xml sau: id là tự động tăng

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.