2010-06-18 39 views
18

Tôi là USign @GeneratedValue (strategy = GenerationType.AUTO) để tạo ID trên thực thể của tôi.Trình tự Hibernate trên oracle, @GeneratedValue (strategy = GenerationType.AUTO)

Tôi hiện không làm thế nào nó hoạt động, nhưng trên bảng con của tôi, tạo ra các giá trị ID, theo chuỗi gốc.

//parent table 
@Entity 
@Table (name = "parent") 
public class Parent { 

    @Id 
    @GeneratedValue (strategy = GenerationType.AUTO) 
    @Column (name = "id") 
    private long id; 


    @OneToMany (cascade = {CascadeType.ALL}, fetch = FetchType.LAZY) 
    @JoinColumn (name = "parentId") 
    @ForeignKey (name = "FKparent") 
    private List<child> child; 

} 

//child table 
@Entity 
@Table (name = "child") 
public class Child { 

    @Id 
    @GeneratedValue (strategy = GenerationType.AUTO) 
    @Column (name = "id") 
    private long id; 
} 

Giá trị ID được chèn vào cha mẹ, cập nhật trình tự. Giá trị ID được chèn vào con, cập nhật chuỗi. Ngày chèn phụ huynh tiếp theo, chuỗi ... sử dụng giá trị được cập nhật bởi chèn con ...

Chú thích này, không tạo hai chuỗi, chỉ một. Điều này có đúng không?

tôi chèn các đối tượng của tôi với dịch vụ DAO tôi chỉ sử dụng entityManager.persist(parent);

Trả lời

1

Có điều này là chính xác và mong đợi.

Bạn có thể tạo các chuỗi riêng lẻ cho mỗi bảng, nhưng IMHO chỉ là mã bổ sung mà không có lợi ích thực tế.

+0

Không nếu người dùng cuối thấy rằng chìa khóa và lầm lạc bởi nó là " ". Và đừng nói với tôi rằng chìa khóa cần phải ẩn khỏi người dùng, điều đó không phải lúc nào cũng có thể ... – Monoman

+1

Không có cách nào để giữ id liên tục trong thời gian và đơn điệu và không có lỗ trong trình tự, điều đó không giết khả năng mở rộng. Tôi đã không thấy một định nghĩa hữu ích về 'nhảy' và tại sao người dùng lại cần ID không rõ ràng. –

44

Các chú thích này không tạo hai chuỗi, chỉ một. Điều này có đúng không?

Đó là hành vi mong đợi. Khi sử dụng @GeneratedValue(strategy = GenerationType.AUTO), nhà cung cấp JPA sẽ chọn một chiến lược thích hợp cho cơ sở dữ liệu cụ thể. Trong trường hợp của Oracle, đây sẽ là SEQUENCE và, vì bạn không chỉ định bất cứ điều gì, Hibernate sẽ sử dụng một chuỗi toàn cầu duy nhất có tên là hibernate_sequence.

Điều này có đúng không? Vâng, tôi không biết, nó phụ thuộc vào nhu cầu của bạn. Chỉ trong trường hợp, giá trị tối đa mặc định cho một chuỗi Oracle là 1E + 27, hoặc 1.000.000.000.000.000.000.000.000. Đó là đủ cho nhiều người.

Bây giờ, chúng ta có thể sử dụng GenerationType.AUTO và vẫn kiểm soát tên của chuỗi khi cơ sở dữ liệu sử dụng các trình tự:

@Id 
@GeneratedValue(strategy=GenerationType.AUTO, generator="my_entity_seq_gen") 
@SequenceGenerator(name="my_entity_seq_gen", sequenceName="MY_ENTITY_SEQ") 
private Long id; 
+4

Pascal, nhưng nếu bạn muốn sử dụng GenerationType.AUTO để cho phép các cơ sở dữ liệu khác như MySQL sử dụng Identity Insert này sẽ không hoạt động, phải không? Vì bạn chỉ định thủ công một trình tạo – lujop

0
@Entity 
@Table(name = "table_seq") 
@SequenceGenerator(name= "NAME_SEQUENCE", sequenceName = "SEQ_ID", initialValue=1, allocationSize = 1) 
public class SeqEntity implements Serializable { 
    private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="NAME_SEQUENCE") 
private Long id; 

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