Câu hỏi @SequenceGenerator trên lớp được chú thích với @MappedSuperclass


Tôi có cấu trúc sau đây của các thực thể của tôi:

@MappedSuperclass
public abstract class BaseEntity {
  @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seqGenerator")
  private Long id;
}

@MappedSuperclass
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@SequenceGenerator(name = "seqGenerator", sequenceName = "DICTIONARY_SEQ")
public abstract class Intermed extends BaseEntity {}

@Entity
public class MyEntity1 extends Intermed {}

@Entity
public class MyEntity2 extends Intermed {}

Và tôi có ngoại lệ sau:

    Caused by: org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'sessionFactory' defined in class path resource [context/applicationContext.xml]: 
Invocation of init method failed; nested exception is org.hibernate.AnnotationException: Unknown Id.generator: seqGenerator

Khi tôi thay đổi @MappedSuperclass thành @Entity trên lớp Intermed, mọi thứ đều hoạt động OK. Có vấn đề gì với việc sử dụng @MappedSuperclass và @SequenceGenerator không? Hoặc tôi đã bỏ lỡ một cái gì đó?


8
2017-08-31 09:24


gốc




Các câu trả lời:


Dưới đây là thông số kỹ thuật JPA 1.0 nói về SequenceGenerator chú thích:

9.1.37 Chú thích bộ tạo chuỗi

Các SequenceGenerator chú thích   xác định trình tạo khóa chính   có thể được tham chiếu theo tên khi   yếu tố máy phát điện được chỉ định cho    GeneratedValue chú thích. A   trình tạo chuỗi có thể được chỉ định    trên lớp thực thể hoặc là trên trường khóa hoặc thuộc tính chính. Các   phạm vi của tên máy phát điện là toàn cầu   cho đơn vị bền vững (trên tất cả   loại máy phát điện).

Và một siêu lớp được ánh xạ không phải là một thực thể. Vì vậy, theo cách tôi đọc spec, những gì bạn muốn làm là không thể. Hoặc là làm cho Intermed lớp một thực thể hoặc đặt SequenceGenerator trên các lớp con.


9
2017-08-31 21:55



"theo cách tôi đọc spec" - Tôi thích nó :) - glaz666
JPA 2.0 đang nói về cùng một điều - glaz666
@ glaz666 Hehe :) Và thực sự, điều này không thay đổi trong đặc tả JPA 2.0, cùng một thứ. - Pascal Thivent
vì vậy không có cách nào để xác định 1 chuỗi "toàn cầu" đơn lẻ cho một số thực thể? - radai
@radai Tôi đặt nó trên sân và nó hoạt động. Xem câu trả lời của Kallja. - Jin Kwon


Tôi chạy vào cùng một vấn đề được mô tả trong câu hỏi này trong khi cố gắng để đạt được ứng dụng máy phát id rộng.

Giải pháp thực sự là trong câu trả lời đầu tiên: đặt trình tạo chuỗi trên trường khóa chính.

Giống như vậy:

@MappedSuperclass
public abstract class BaseEntity {
  @Id
  @SequenceGenerator(name = "seqGenerator", sequenceName = "DICTIONARY_SEQ")
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seqGenerator")
  private Long id;
}

@MappedSuperclass
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class Intermed extends BaseEntity {}

@Entity
public class MyEntity1 extends Intermed {}

@Entity
public class MyEntity2 extends Intermed {}

Trong khi làm mọi thứ theo cách này có vẻ ngu ngốc đáng kể (ít nhất là với tôi) nó hoạt động.


11
2018-06-21 18:11



Tôi giải quyết vấn đề của tôi với cách tiếp cận này. Cảm ơn. - Jin Kwon