Trình tự ngủ đông không tồn tại


88

Tôi đã cố gắng nâng cấp chế độ ngủ đông từ 4 lên 5 trong dự án của mình với 4.2phiên bản mùa xuân . Sau khi nâng cấp này, tôi đã tìm thấy lỗi sau trong dấu vết ngăn xếp của mình khi tôi gọi một phương thức để cập nhật.

10:53:32,185 ERROR TableStructure:149 - could not read a hi value
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'test.hibernate_sequence' doesn't exist 

Tôi đã thay đổi Id tự động tăng dần bằng chú thích

@GeneratedValue(strategy=GenerationType.AUTO) 

vẫn còn lỗi.


4
thử cài đặt trong tệp cấu hình `<prop key =" hibernate.id.new_generator_mappings "> false </prop>
Eva Mariam

Câu trả lời:


123

Bạn cũng có thể đặt:

@GeneratedValue(strategy = GenerationType.IDENTITY)

Và để DateBase quản lý sự gia tăng của khóa chính:

AUTO_INCREMENT PRIMARY KEY

13
Điều này có thể tốt trong một số trường hợp, nhưng có một nhược điểm rõ ràng: mọi thứ INSERTsẽ gây ra thêm một chuyến đi vòng quanh Cơ sở dữ liệu để tìm nạp ID. Vì vậy, khi nhược điểm này có thể chấp nhận được thì tốt.
G. Demecki

@ G.Demecki bạn có thể thảo luận về ưu và nhược điểm của việc sử dụng trình tạo danh tính ngủ đông trái ngược với phương pháp khứ hồi này không? Sẽ thực sự hữu ích!
Jordan Mackie.

82

Bạn cần đặt cho Hibernate5.x <property name="hibernate.id.new_generator_mappings">false</property>.. xem và liên kết .

Đối với phiên bản cũ hơn của hibernate 4.x: <prop key="hibernate.id.new_generator_mappings">false</prop>


cái này được thêm vào đâu?
Samuel Thompson

1
thêm điều này vào thuộc tính ngủ đông.
rParvathi


10
Câu trả lời của bạn có thể là giải pháp cho câu hỏi, nhưng nó không giải thích tại sao nó giải quyết được vấn đề. Hãy ghi nhớ rằng các liên kết có xu hướng chết.
Clijsters

51

Làm việc với Spring Boot

Giải pháp

Đặt chuỗi bên dưới trong .application.properties

spring.jpa.properties.hibernate.id.new_generator_mappings=false

Giải trình

Trên Hibernate 4.X, thuộc tính này được mặc định là true.


30

Đây là lý do đằng sau lỗi này:

Nó sẽ tìm cách cơ sở dữ liệu mà bạn đang sử dụng tạo id. Đối với MySql hoặc HSQSL, có các trường gia tăng tự động tăng. Trong Postgres hoặc Oracle, họ sử dụng bảng trình tự. Vì bạn không chỉ định tên bảng trình tự, nó sẽ tìm kiếm một bảng trình tự có tên hibernate_sequence và sử dụng nó làm mặc định. Vì vậy, có thể bạn không có bảng tuần tự như vậy trong cơ sở dữ liệu của mình và bây giờ bạn gặp lỗi đó.


1
nên được đánh dấu là một câu trả lời vì điều này giải thích mọi thứ một cách đơn giản - tất nhiên là một phần bổ sung của "spring.jpa.properties.hibernate.id.new_generator_mappings = false" nên được đề cập nhưng cảm ơn.
nightfury

15

Tôi gặp phải lỗi tương tự "com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Bảng 'mylocaldb.hibernate_sequence' không tồn tại".

Sử dụng spring mvc 4.3.7 và phiên bản hibernate 5.2.9, ứng dụng được tạo bằng cấu hình dựa trên Spring java. Bây giờ tôi phải thêm thuộc hibernate.id.new_generator_mappingstính được đề cập bởi @Eva Mariam trong mã của mình như sau:

@Autowired
    @Bean(name = "sessionFactory")
    public SessionFactory getSessionFactory(DataSource dataSource) {

        LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource);
        sessionBuilder.addProperties(getHibernateProperties());
        sessionBuilder.addAnnotatedClasses(User.class);

        return sessionBuilder.buildSessionFactory();
    }

    private Properties getHibernateProperties() {
        Properties properties = new Properties();
        properties.put("hibernate.show_sql", "true");
        properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
        properties.put("hibernate.id.new_generator_mappings","false");
        return properties;
    }

Và nó hoạt động như một sự quyến rũ.


14

FYI

Nếu bạn đang sử dụng tệp hbm để xác định ánh xạ O / R.

Thông báo rằng:

Trong Hibernate 5, tên tham số cho tên trình tự đã được thay đổi .

Cài đặt sau hoạt động tốt trong Hibernate 4 :

<generator class="sequence">
    <param name="sequence">xxxxxx_seq</param>
</generator>

Nhưng trong Hibernate 5 , cùng một tệp cài đặt ánh xạ sẽ gây ra lỗi "hibernate_sequence không tồn tại".

Để khắc phục lỗi này, tên tham số phải thay đổi thành:

<generator class="sequence">
    <param name="sequence_name">xxxxxx_seq</param>
</generator>

Vấn đề này làm tôi lãng phí 2, 3 giờ.

Và bằng cách nào đó, có vẻ như không có tài liệu nào về nó.

Tôi phải đọc mã nguồn của org.hibernate.id.enhanced.SequenceStyleGenerator để tìm ra nó


7

Khi bạn sử dụng

@GeneratedValue(strategy=GenerationType.AUTO)

hoặc là

@GeneratedValue đó là cách ngắn gọn của những điều trên, Hibernate bắt đầu quyết định chiến lược tạo tốt nhất cho bạn, trong trường hợp này, nó đã chọn

GenerationType.SEQUENCE là chiến lược và đó là lý do tại sao nó đang tìm kiếm

schemaName.hibernate_sequence là một bảng, để tạo id dựa trên trình tự.

Khi bạn sử dụng GenerationType.SEQUENCElàm chiến lược, bạn cần cung cấp những điều @TableGeneratorsau.

     @Id
     @GeneratedValue(strategy = GenerationType.TABLE, generator = "user_table_generator")
     @TableGenerator(name = "user_table_generator",
                table = "user_keys", pkColumnName = "PK_NAME", valueColumnName = "PK_VALUE")
     @Column(name = "USER_ID")
     private long userId;

Khi bạn đặt chiến lược, nó sẽ

@GeneratedValue(strategy = GenerationType.IDENTITY) .

vấn đề ban đầu được giải quyết vì sau đó Hibernate ngừng tìm kiếm bảng trình tự.


6

Chỉ trong trường hợp ai đó kéo tóc của họ ra với sự cố này như tôi đã làm hôm nay, tôi không thể giải quyết lỗi này cho đến khi tôi thay đổi

spring.jpa.hibernate.dll-auto=create

đến

spring.jpa.properties.hibernate.hbm2ddl.auto=create

5

trong hibernate 5.x, bạn nên thêm set hibernate.id.new_generator_mappings thành false trong hibernate.cfg.xml

<session-factory>
    ......
    <property name="show_sql">1</property>
    <property name="hibernate.id.new_generator_mappings">false</property>
     ......
 </session-factory>

2

Bạn cũng có thể đặt:

@GeneratedValue(strategy = GenerationType.IDENTITY)

Và để DateBase quản lý sự gia tăng của khóa chính:

AUTO_INCREMENT PRIMARY KEY

Câu trả lời trên đã giúp tôi.


1

Nếu bạn đang sử dụng phiên bản Hibernate trước khi Hibernate5 @GeneratedValue(strategy = GenerationType.IDENTITY)hoạt động như một sự quyến rũ. Nhưng đăng Hibernate5, bản sửa lỗi sau là cần thiết.

@Id
@GeneratedValue(strategy= GenerationType.AUTO,generator="native")
@GenericGenerator(name = "native",strategy = "native")
private Long id;

DDL

`id` BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY

LÝ DO

Trích từ hibernate-issue

Hiện tại, nếu hibernate.id.new_generator_mappings được đặt thành false, thì @GeneratedValue (chiến lược = GenerationType.AUTO) sẽ được ánh xạ thành bản địa. Nếu thuộc tính này là true (là giá trị defult trong 5.x), thì @GeneratedValue (chiến lược = GenerationType.AUTO) luôn được ánh xạ tới SequenceStyleGenerator.

Vì lý do này, trên bất kỳ cơ sở dữ liệu nào không hỗ trợ trình tự nguyên bản (ví dụ: MySQL), chúng tôi sẽ sử dụng trình tạo TABLE thay vì IDENTITY.

Tuy nhiên, trình tạo TABLE, mặc dù di động hơn, sử dụng một giao dịch riêng biệt mỗi khi một giá trị được tìm nạp từ cơ sở dữ liệu. Trên thực tế, ngay cả khi IDENTITY tắt cập nhật hàng loạt JDBC và trình tạo TABLE sử dụng trình tối ưu hóa tổng hợp, IDENTITY vẫn mở rộng quy mô tốt hơn.


0

Điều này có thể do HHH-10876 đã được khắc phục, vì vậy hãy đảm bảo bạn cập nhật lên:

  • Hibernate ORM 5.2.1,
  • Hibernate ORM 5.1.1,
  • Hibernate ORM 5.0.11

1
Tôi đang sử dụng Spring-data-jpa mà nội bộ đang sử dụng Hibernate 5.2.17.Finallàm triển khai. Tôi vẫn nhận được vấn đề này khi GenerationTypeđược AUTO.
TheCoder

0

Tôi đã thêm trình tự Hibernate trong postgres. Chạy truy vấn này trong PostGres Editor:

    CREATE SEQUENCE hibernate_sequence
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 2
  CACHE 1;
ALTER TABLE hibernate_sequence
  OWNER TO postgres;

Tôi sẽ tìm ra ưu / nhược điểm của việc sử dụng truy vấn nhưng đối với những người cần trợ giúp có thể sử dụng điều này.


0

Trong trường hợp của tôi, thay thế tất cả các chú thích GenerationType.AUTObằng cách GenerationType.SEQUENCEgiải quyết vấn đề.


-2

Chạy truy vấn này

create sequence hibernate_sequence start with 1 increment by 1

Yêu cầu bạn chia sẻ chi tiết cách nó giải quyết vấn đề và câu trả lời của bạn tốt hơn các câu trả lời khác ...
Suraj Kumar
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.