Has Spring-boot changed the way auto-increment of ids works through @GeneratedValue?

后端 未结 4 1767
难免孤独
难免孤独 2021-02-12 20:25

Spring-Boot 2.0.0 seems to have modified the way Hibernate is auto configured.

Let\'s suppose two simple and independent JPA entities:

相关标签:
4条回答
  • 2021-02-12 20:55

    If you are in need for a quick, not future-proof solution to prevent this issue from happening:

    spring.jpa.hibernate.use-new-id-generator-mappings=false, as from the Spring Boot 2 docs:

    spring.jpa.hibernate.use-new-id-generator-mappings= # Whether to use Hibernate's newer IdentifierGenerator for AUTO, TABLE and SEQUENCE.

    This will prevent from using the new generators and keep the old functionality included in Spring boot 1.x.x.

    Please note that this is probably not the best solution, but it is very helpful on short term

    0 讨论(0)
  • 2021-02-12 20:58

    As Andrew has pointed out in the comment, if you don't want the id to be incremented while values are created in other tables, you can specify your ID like this:

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

    Doing this will make each table has its unique id beginning with 1,2,3 ... and so on.

    0 讨论(0)
  • 2021-02-12 21:02

    Spring Boot 2.0 uses Hibernate 5.2 (https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Release-Notes).
    Hibernate changes its GeneratedType.AUTO strategy since 5.2. Any database that does not support sequences natively (e.g. MySQL), they use the TABLE generator instead of IDENTITY. (https://hibernate.atlassian.net/browse/HHH-11014)

    That's why GeneratedType.AUTO does not work as you expected.

    0 讨论(0)
  • 2021-02-12 21:06

    You can use

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    

    to use MySQL autoincrement.

    0 讨论(0)
提交回复
热议问题