Hibernate错误:在调用save()之前必须手动分配此类的ids。
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
}
我得到了上述错误。
Hibernate错误:在调用save()之前,此类的id必须手动分配
出现原因:可能需要在两个类中添加(strategy = GenerationType.IDENTITY)
解决方法:可以参考以下链接:Hibernate: ids for this class must be manually assigned before calling save()
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。