Hibernate SpringBoot 2.1.5.RELEASE&;中未生成GenerationType.IDENTITY;MySQL 8.0.15

Hibernate SpringBoot 2.1.5.RELEASE&;中未生成GenerationType.IDENTITY;MySQL 8.0.15,hibernate,spring-boot,jpa,junit,spring-data-jpa,Hibernate,Spring Boot,Jpa,Junit,Spring Data Jpa,我有一个基本的SpringBoot 2.1.5.RELEASE应用程序。使用Spring初始值设定项、JPA、嵌入式Tomcat、Thymeleaf模板引擎,并将包作为可执行JAR文件 我有这个域类: @Entity @Table(name="t_purchase") @JsonInclude(JsonInclude.Include.NON_NULL) public class Purchase implements Serializab

我有一个基本的SpringBoot 2.1.5.RELEASE应用程序。使用Spring初始值设定项、JPA、嵌入式Tomcat、Thymeleaf模板引擎,并将包作为可执行JAR文件

我有这个域类:

     @Entity
        @Table(name="t_purchase")
        @JsonInclude(JsonInclude.Include.NON_NULL)
        public class Purchase implements Serializable {

            public Purchase() {
            }

            public Purchase(Shop shop) {
                super();
                this.shop = shop;
            }

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

@JsonProperty("txHash")
    private String txHash;

            @ManyToOne(fetch = FetchType.EAGER)
            @JoinColumn(name = “shop_id")
            @JsonIgnore
            Shop shop;


    @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Purchase purchase = (Purchase) o;

            if (getTxHash()==null && purchase.getTxHash()==null) {
                 return id == purchase.id;
            } else {
                return Objects.equals(getTxHash(), purchase.getTxHash());
            }
        }



        @Override
        public int hashCode() {
            int result = (int) (id ^ (id >>> 32));
            result = 31 * result + Objects.hash(getTxHash());
            return result;
        }

        …
        }
然后我创建了这个Junit方法:

   @Test
    public void testFindByShopIdWithPurchases () {

        Shop shop = new Shop ("Shop_NAME");

        shopService.save(shop);

        Purchase purchase1 = new Purchase(shop);
        Purchase purchase2 = new Purchase(shop);

        shop.getPurchases().add(purchase1);
        shop.getPurchases().add(purchase2);

        shopService.save(shop);

        assertNotEquals (purchase1, purchase2);


    }   
但我有一个AssertionError,因为两个对象的id似乎都是0:

java.lang.AssertionError: Values should be different. Actual: Purchase [id=0, txHash=null, shop=957]
这里是商店:

 @Entity
    @Table(name = “t_shop")
    public class Shop implements Serializable {


        public Shop(String name) {
            this.name = name;
        }

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

        @JsonProperty("name")
        private String name;

        @OneToMany(mappedBy = “shop", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
        @JsonIgnore
        private Set<Purchase> purchases = new HashSet<Purchase>();

            …
    }
@实体
@表(name=“t_店”)
公共类商店实现了可序列化{
公共商店(字符串名称){
this.name=名称;
}
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@JsonProperty(“id”)
私人长id;
@JsonProperty(“名称”)
私有字符串名称;
@OneToMany(mappedBy=“shop”,cascade=CascadeType.ALL,orphan=true,fetch=FetchType.LAZY)
@杰索尼奥雷
私有集购买=新HashSet();
…
}

将类型更改为自动为我解决了问题

将类型更改为自动为我解决了问题

 @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @JsonProperty("id")
        private Long id;   
当您使用GenerationTypeIDENTITY时,这意味着如果休眠,您将负责生成ID

如果希望应用程序自动管理id生成,请使用GenerationTypeauto 因此,在购买商店实体中更新您的世代类型

 @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @JsonProperty("id")
        private Long id;  

如果在上述更改后仍会出现错误:

 java.sql.SQLSyntaxErrorException: Table 'shops_db.hibernate_sequence' doesn't exist 
默认情况下,Hibernate从Hibernate_序列表生成密钥,我们可以通过将Hibernate.use-new-id-generator-mappings设置为false来禁用它

spring.jpa.hibernate.use-new-id-generator-mappings=false
在应用程序中设置此属性。属性

当您使用GenerationTypeIDENTITY时,这意味着如果休眠,您将负责生成ID

如果希望应用程序自动管理id生成,请使用GenerationTypeauto 因此,在购买商店实体中更新您的世代类型

 @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @JsonProperty("id")
        private Long id;  

如果在上述更改后仍会出现错误:

 java.sql.SQLSyntaxErrorException: Table 'shops_db.hibernate_sequence' doesn't exist 
默认情况下,Hibernate从Hibernate_序列表生成密钥,我们可以通过将Hibernate.use-new-id-generator-mappings设置为false来禁用它

spring.jpa.hibernate.use-new-id-generator-mappings=false

在应用程序中设置此属性。属性

尝试更改下面提到的属性
spring.jpa.hibernate。使用新的id生成器映射=false
由于新的spring启动版本2.XX已将此属性更改为
spring.jpa.hibernate。使用新的id生成器映射=true
使用下面的链接了解详细信息

尝试更改下面提到的属性
spring.jpa.hibernate。使用新的id生成器映射=false
由于新的spring启动版本2.XX已将此属性更改为
spring.jpa.hibernate。使用新的id生成器映射=true
使用下面的链接了解详细信息

从Spring 2.X.X发行版开始,
Spring数据jpa
模块使用Hibernate5版本。如果您浏览
org.springframework.data:Spring数据jpa:2.1.5.RELEASE
pom.xml文件,您会发现hibernate依赖项的版本如下

<hibernate>5.2.17.Final</hibernate>
DDL

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

摘自

当前,如果hibernate.id.new_生成器_映射设置为false, @GeneratedValue(strategy=GenerationType.AUTO)映射到本机。 如果此属性为true(即5.x中的defult值),则 @GeneratedValue(策略=GenerationType.AUTO)始终映射到 序列样式生成器

因此,在任何不支持序列的数据库上 在本地(例如MySQL),我们将使用表生成器 身份认同

然而,表生成器虽然更便携,但使用单独的 每次从数据库中提取值时的事务。在 事实上,即使标识禁用了JDBC批处理更新和表 生成器使用池式优化器,身份仍然可以更好地扩展


从Spring 2.X.X发行版开始,使用Hibernate5版本的
Spring数据jpa
模块。如果您浏览
org.springframework.data:Spring数据jpa:2.1.5.RELEASE
pom.xml文件,您会发现hibernate依赖项的版本如下

<hibernate>5.2.17.Final</hibernate>
DDL

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

摘自

当前,如果hibernate.id.new_生成器_映射设置为false, @GeneratedValue(strategy=GenerationType.AUTO)映射到本机。 如果此属性为true(即5.x中的defult值),则 @GeneratedValue(策略=GenerationType.AUTO)始终映射到 序列样式生成器

因此,在任何不支持序列的数据库上 在本地(例如MySQL),我们将使用表生成器 身份认同

然而,表生成器虽然更便携,但使用单独的 每次从数据库中提取值时的事务。在 事实上,即使标识禁用了JDBC批处理更新和表 生成器使用池式优化器,身份仍然可以更好地扩展


更改为自动时出现此错误:java.sql.SQLSyntaxErrorException:Table'shops\u db.hibernate\u sequence'不存在请共享应用程序的hibernate.ddl-AUTO设置更改为自动时出现此错误:java.sql.sqlsyntaxerroxception:Table'shops\u db.hibernate\u sequence'不存在请共享hibernate.ddl-AUTO应用程序的设置是用
@Transactional
注释的测试吗?如果不是,您可以尝试添加它吗?确实是:(您的测试是用
@Transactional
注释的吗?如果不是,您可以尝试添加它吗?确实是:(