java 找不到Sping Boot JPA CrudRepository错误表

s4n0splo  于 2023-05-12  发布在  Java
关注(0)|答案(2)|浏览(132)

我试图在我的项目中设置一个简单的Hibernate + Spring JPA存储库示例。我用的是oracle数据库,供参考。
我有一个简单的实体声明如下

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;

@Entity
@Table(name = "item")
public class Item {
    
    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    private long Id;
    
    private String name;
    private String detail;
    
}

在运行项目时,hibernate在oracle中创建了一个名为hte_item的表。
我已经设置了一个控制器,它试图获取表中的所有项目。我创建了以下存储库

import java.util.List;

import org.springframework.data.repository.CrudRepository;

public interface ItemRepository extends CrudRepository<Item, Long> {
    List<Item> findAll();
}

相反,当运行itemRepository.findAll时,Spring JPA对数据库运行以下查询。
select i1_0.id,i1_0.detail,i1_0.name from item i1_0
抛出Oracle错误ORA-00942: Table or view does not exist
如果您注意到,查询不包括Hibernate生成的前缀,这会生成Oracle错误。我是否在这里遗漏了与配置相关的内容?

2hh7jdfx

2hh7jdfx1#

'hte'前缀意味着它是hibernate生成的临时表。它不是你的实体的table。
基本上,您需要手动或通过某些自动化过程创建表。例如,请参见How to create database schema in hibernate first time and further update it in case of schema modification?

wlzqhblo

wlzqhblo2#

在运行项目时,hibernate在oracle中创建了一个名为hte_item的表。
hte_item表是Hibernate用于某些批量更新和删除查询的临时表。它 * 不是 * Item持久化的表的名称。
因为你已经指定了@Table(name = "item"),所以你的数据库中必须有一个名为item的表。如果你想让Hibernate为你导出那个表,那么你需要通过设置一个config属性来显式地启用schema导出:

jakarta.persistence.schema-generation.database.action=create

或者别的什么。

相关问题