ไม่มีลำดับไฮเบอร์เนต


88

ฉันพยายามอัปเกรดไฮเบอร์เนตจาก 4 เป็น 5 ในโปรเจ็กต์ของฉันด้วย4.2เวอร์ชันฤดูใบไม้ผลิ หลังจากการอัพเกรดนี้ฉันพบข้อผิดพลาดต่อไปนี้ในการติดตามสแต็กของฉันเมื่อฉันเรียกวิธีการอัปเดต

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 

ฉันเปลี่ยนรหัสที่เพิ่มขึ้นโดยอัตโนมัติพร้อมคำอธิบายประกอบ

@GeneratedValue(strategy=GenerationType.AUTO) 

ข้อผิดพลาดยังคงอยู่


4
ลองตั้งค่าในไฟล์ config `<prop key =" hibernate.id.new_generator_mappings "> false </prop>
Eva Mariam

คำตอบ:


123

คุณยังสามารถใส่:

@GeneratedValue(strategy = GenerationType.IDENTITY)

และปล่อยให้ DateBase จัดการการเพิ่มของคีย์หลัก:

AUTO_INCREMENT PRIMARY KEY

13
สิ่งนี้อาจจะดีในบางกรณี แต่ก็มีข้อเสียเปรียบอย่างชัดเจนทุกครั้งINSERTจะทำให้เกิดการเดินทางไปกลับฐานข้อมูลเพิ่มเติมอีกหนึ่งครั้งเพื่อดึง ID ดังนั้นเมื่อข้อเสียเปรียบนี้เป็นที่ยอมรับได้
G. Demecki

@ G.Demecki คุณจะสามารถพูดคุยถึงข้อดีข้อเสียของการใช้ hibernates identity generator ในทางตรงกันข้ามกับวิธีการเดินทางไปกลับนี้ได้หรือไม่? จะมีประโยชน์จริงๆ!
Jordan Mackie

83

คุณจะต้องตั้งสำหรับ Hibernate5.x <property name="hibernate.id.new_generator_mappings">false</property>.. เห็นและการเชื่อมโยง

สำหรับเวอร์ชันเก่ากว่าของ hibernate 4.x: <prop key="hibernate.id.new_generator_mappings">false</prop>


สิ่งนี้จะเพิ่มที่ไหน
Samuel Thompson

1
เพิ่มสิ่งนี้ในคุณสมบัติไฮเบอร์เนต
rParvathi


10
คำตอบของคุณอาจเป็นคำตอบสำหรับคำถาม แต่ไม่ได้อธิบายว่าเหตุใดจึงช่วยแก้ปัญหาได้ โปรดทราบว่าลิงก์มีแนวโน้มที่จะตาย
Clijsters

51

ทำงานกับ Spring Boot

วิธีการแก้

ใส่สตริงด้านล่างใน. application.properties

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

คำอธิบาย

บนไฮเบอร์เนต 4.X แอตทริบิวต์นี้มีค่าเริ่มต้นเป็นtrue.


30

นี่คือเหตุผลเบื้องหลังข้อผิดพลาดนี้:

มันจะค้นหาว่าฐานข้อมูลที่คุณใช้สร้างรหัสอย่างไร สำหรับ MySql หรือ HSQSL มีฟิลด์ส่วนเพิ่มที่เพิ่มขึ้นโดยอัตโนมัติ ใน Postgres หรือ Oracle จะใช้ตารางลำดับ เนื่องจากคุณไม่ได้ระบุชื่อตารางลำดับมันจะมองหาตารางลำดับที่ชื่อ hibernate_sequence และใช้เป็นค่าเริ่มต้น ดังนั้นคุณอาจไม่มีตารางลำดับดังกล่าวในฐานข้อมูลของคุณและตอนนี้คุณได้รับข้อผิดพลาดนั้น


1
ควรทำเครื่องหมายเป็นคำตอบเนื่องจากสิ่งนี้อธิบายสิ่งต่างๆได้ง่าย ๆ - แน่นอนว่าควรกล่าวถึง "spring.jpa.properties.hibernate.id.new_generator_mappings = false" แต่ต้องขอบคุณ
nightfury

15

ฉันได้รับข้อผิดพลาดเดียวกัน "com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: ไม่มีตาราง 'mylocaldb.hibernate_sequence'

การใช้ spring mvc 4.3.7 และ hibernate เวอร์ชัน 5.2.9 แอปพลิเคชันถูกสร้างขึ้นโดยใช้การกำหนดค่าตาม Spring java ตอนนี้ฉันต้องเพิ่มhibernate.id.new_generator_mappingsคุณสมบัติที่กล่าวถึงโดย @Eva Mariam ในรหัสของฉันดังนี้:

@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;
    }

และมันทำงานได้อย่างมีเสน่ห์


14

FYI

หากคุณใช้ไฟล์ hbm เพื่อกำหนดการแมป O / R

สังเกตว่า:

ใน Hibernate 5 ชื่อพารามิเตอร์สำหรับชื่อลำดับที่ได้รับการเปลี่ยนแปลง

การตั้งค่าต่อไปนี้ทำงานได้ดีในHibernate 4 :

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

แต่ในHibernate 5ไฟล์การตั้งค่าการแมปเดียวกันจะทำให้เกิดข้อผิดพลาด "hibernate_sequence ไม่มีอยู่"

ในการแก้ไขข้อผิดพลาดนี้ชื่อพารามิเตอร์ต้องเปลี่ยนเป็น:

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

ปัญหานี้ทำให้ฉันเสียเวลาไป 2, 3 ชั่วโมง

และดูเหมือนว่าไม่มีเอกสารเกี่ยวกับเรื่องนี้

ฉันต้องอ่านซอร์สโค้ดของ org.hibernate.id.enhanced.SequenceStyleGenerator เพื่อค้นหา


7

เมื่อคุณใช้

@GeneratedValue(strategy=GenerationType.AUTO)

หรือ

@GeneratedValue ซึ่งเป็นวิธีการมือสั้น ๆ ข้างต้นไฮเบอร์เนตเริ่มตัดสินใจเลือกกลยุทธ์การสร้างที่ดีที่สุดสำหรับคุณในกรณีนี้ได้เลือก

GenerationType.SEQUENCE เป็นกลยุทธ์และนั่นคือเหตุผลที่มองหา

schemaName.hibernate_sequence ซึ่งเป็นตารางสำหรับการสร้างรหัสตามลำดับ

เมื่อคุณใช้GenerationType.SEQUENCEเป็นกลยุทธ์ที่คุณต้องระบุ@TableGeneratorดังต่อไปนี้

     @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;

เมื่อคุณกำหนดกลยุทธ์ให้เป็นไป

@GeneratedValue(strategy = GenerationType.IDENTITY) .

ปัญหาเดิมได้รับการแก้ไขแล้วเนื่องจากไฮเบอร์เนตหยุดค้นหาตารางลำดับ


7

ในกรณีที่มีคนดึงผมออกด้วยปัญหานี้เหมือนที่ฉันทำในวันนี้ฉันไม่สามารถแก้ไขข้อผิดพลาดนี้ได้จนกว่าจะเปลี่ยน

spring.jpa.hibernate.dll-auto=create

ถึง

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

5

ใน hibernate 5.x คุณควรเพิ่ม set hibernate.id.new_generator_mappings เป็น false ใน hibernate.cfg.xml

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


2

หากคุณใช้ Hibernate เวอร์ชันก่อน Hibernate5 จะ@GeneratedValue(strategy = GenerationType.IDENTITY)ทำงานได้อย่างมีเสน่ห์ แต่โพสต์ Hibernate5 จำเป็นต้องแก้ไขต่อไปนี้

@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

เหตุผล

ตัดตอนมาจากปัญหาการจำศีล

ปัจจุบันหาก hibernate.id.new_generator_mappings ถูกตั้งค่าเป็นเท็จ @GeneratedValue (strategy = GenerationType.AUTO) จะถูกแมปกับเนทีฟ หากคุณสมบัตินี้เป็นจริง (ซึ่งเป็นค่าเริ่มต้นใน 5.x) @GeneratedValue (strategy = GenerationType.AUTO) จะถูกแมปกับ SequenceStyleGenerator เสมอ

ด้วยเหตุนี้ในฐานข้อมูลใด ๆ ที่ไม่รองรับลำดับดั้งเดิม (เช่น MySQL) เราจะใช้ตัวสร้างตารางแทน IDENTITY

อย่างไรก็ตามตัวสร้างตารางแม้ว่าจะพกพาได้มากขึ้น แต่ก็ใช้ธุรกรรมแยกกันทุกครั้งที่มีการดึงค่าจากฐานข้อมูล ในความเป็นจริงแม้ว่า IDENTITY จะปิดใช้งานการอัปเดตแบตช์ JDBC และตัวสร้าง TABLE จะใช้เครื่องมือเพิ่มประสิทธิภาพแบบรวมกลุ่ม IDENTITY ก็ยังคงปรับขนาดได้ดีกว่า


0

อาจเกิดจากHHH-10876ซึ่งได้รับการแก้ไขดังนั้นโปรดตรวจสอบให้แน่ใจว่าคุณอัปเดตเป็น:

  • ไฮเบอร์เนต ORM 5.2.1,
  • ไฮเบอร์เนต ORM 5.1.1,
  • ไฮเบอร์เนต ORM 5.0.11.2

1
ฉันใช้ Spring-data-jpa ซึ่งภายในใช้Hibernate 5.2.17.Finalเป็นการนำไปใช้งาน ฉันยังคงได้รับปัญหานี้เมื่อเป็นGenerationType AUTO
TheCoder

0

ฉันเพิ่มลำดับไฮเบอร์เนตใน postgres เรียกใช้แบบสอบถามนี้ใน PostGres Editor:

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

ฉันจะหาข้อดี / ข้อเสียของการใช้แบบสอบถาม แต่สำหรับคนที่ต้องการความช่วยเหลือสามารถใช้สิ่งนี้ได้


0

ในกรณีของฉันการแทนที่คำอธิบายประกอบทั้งหมดGenerationType.AUTOโดยGenerationType.SEQUENCEแก้ไขปัญหา


-2

เรียกใช้แบบสอบถามนี้

create sequence hibernate_sequence start with 1 increment by 1

ขอให้คุณเล่ารายละเอียดว่ามันแก้ปัญหาได้อย่างไรและคำตอบของคุณดีกว่าคำตอบอื่น ๆ ...
Suraj Kumar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.