Hibernate SpringBoot 2.1.5.RELEASE&;中未生成GenerationType.IDENTITY;MySQL 8.0.15
我有一个基本的SpringBoot 2.1.5.RELEASE应用程序。使用Spring初始值设定项、JPA、嵌入式Tomcat、Thymeleaf模板引擎,并将包作为可执行JAR文件 我有这个域类: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
@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
注释的吗?如果不是,您可以尝试添加它吗?确实是:(