Hibernate错误:在调用save()之前必须手动分配此类的ids。

9 浏览
0 Comments

Hibernate错误:在调用save()之前必须手动分配此类的ids。

我对Hibernate和Spring还不熟悉,正在尝试创建一个食品配送应用程序。我有两个类,Restaurant和CustomerOrder,它们通过一对一的关联进行映射。

CustomerOrder.java

@Entity
@Table
@Getter
@Setter
public class CustomerOrder {
    @Id
    Long id;
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "restaurant_id", nullable = false)
    Restaurant restaurant;
}

Restaurant.java

@Entity
@Table
@Getter
@Setter
public class Restaurant {
    @Id
    Long id;
    String name;
    String address;
    @OneToOne(mappedBy = "restaurant")
    CustomerOrder customerOrder;
}

我已经预先填充了PostgreSQL数据库。我正在使用import.sql来实现它,在应用程序启动时加载数据库中的值。

import.sql

insert into customer("id", "location", "name") values (1, 'cg road', 'kunal');
insert into customer("id", "location", "name") values (2, 'delux avenue', 'tirth');
insert into customer("id", "location", "name") values (3, 'sp road', 'parth');
insert into restaurant("id", "address", "name") values(1, 'divine circle', 'grand thaker');
insert into restaurant("id", "address", "name") values(2, 'alpha mall', 'honest');
insert into restaurant("id", "address", "name") values(3, 'acropolish mall', 'starbucks');

application.properties

spring.datasource.url=jdbc:postgresql://localhost:5432/zomato1?createDatabaseIfNotExist=true
spring.datasource.username=
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.format_sql=true

当我使用以下请求体进行POST请求以创建CustomerOrder的新条目时:

{

"id" : 1,

"restaurant_id" : 2

}

我得到了上述错误。

0
0 Comments

Hibernate错误:在调用save()之前,此类的id必须手动分配

出现原因:可能需要在两个类中添加(strategy = GenerationType.IDENTITY)

解决方法:可以参考以下链接:Hibernate: ids for this class must be manually assigned before calling save()

0
0 Comments

Hibernate错误:在调用save()之前必须手动分配此类的ID。

这个问题出现的原因是,Hibernate要求在调用save()方法之前,为该类分配ID。如果没有手动分配ID,就会出现该错误。

解决方法之一是将生成ID的责任交给数据库。这样,在保存实体之前,数据库会自动为实体分配一个ID,从而解决该问题。

另一种方法是在实体持久化之前生成ID。以下示例展示了一种为实体生成ID的方法:

CustomerOrder customerOrder = ...; // 获取实体的一个实例
customerOrder.setId(getNextId()); // getNextId()方法返回潜在的实体ID
customerOrderRepository.save(customerOrder);

以上代码中,我们首先获取了一个CustomerOrder实体的实例,然后调用getNextId()方法来生成一个潜在的实体ID,并将其设置为实体的ID。最后,通过调用save()方法将实体保存到数据库中。

通过以上方法,我们可以解决Hibernate错误:在调用save()之前必须手动分配此类的ID。

0