Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Spring启动期间执行本机SQL查询_Java_Sql_Spring_Hibernate - Fatal编程技术网

Java 在Spring启动期间执行本机SQL查询

Java 在Spring启动期间执行本机SQL查询,java,sql,spring,hibernate,Java,Sql,Spring,Hibernate,我将Spring和Hibernate与自动生成的数据库一起使用(为此,我在JPA配置属性中将“Hibernate.hbm2ddl.auto”设置为“update”) 我还有一个带注释的类@Configuration,它有一个@PostConstruct方法,在创建或更新数据库后,在应用程序启动时调用该方法。在这里,如果数据库为空(首次启动),我将使用一些默认数据设置数据库 现在我想执行一些自定义的本机SQL查询。这些查询不会返回任何内容,它们只是配置内容(比如创建额外的索引或扩展) 目前,为了创

我将Spring和Hibernate与自动生成的数据库一起使用(为此,我在JPA配置属性中将
“Hibernate.hbm2ddl.auto”
设置为
“update”

我还有一个带注释的类
@Configuration
,它有一个
@PostConstruct
方法,在创建或更新数据库后,在应用程序启动时调用该方法。在这里,如果数据库为空(首次启动),我将使用一些默认数据设置数据库

现在我想执行一些自定义的本机SQL查询。这些查询不会返回任何内容,它们只是配置内容(比如创建额外的索引或扩展)

目前,为了创建新的Hibernate
会话,我一直在创建一个
会话工厂
。我尝试过自动布线,但不起作用:

@Autowired
SessionFactory sessionFactory;
给我:
字段sessionFactory in。。。需要找不到类型为“org.hibernate.SessionFactory”的bean。

我知道我可能需要在其他地方配置它,但我不知道在哪里。有几个答案使用xml配置文件,但我没有使用任何配置文件,所以我不能这样做


Spring是否有办法使用适当的配置创建会话工厂?

您可以自动连接JPA
EntityManager
,如下所示:

@PersistenceContext
EntityManager entityManager;
entityManager.unwrap(Session.class);
如果您确实需要Hibernate
会话
并且正在使用JPA 2.1,则可以从
EntityManager
获取
会话
,如下所示:

@PersistenceContext
EntityManager entityManager;
entityManager.unwrap(Session.class);

您甚至不需要访问SessionFactory。请将脚本放入文件src/main/resources/scripts/myscript.sql中。然后,可以使用Spring执行以下操作:

@Component
public class Startup {

    @Autowired
    private DataSource dataSource;

    @PostConstruct
    public void runNativeSql() {
        ClassPathResource resource = new ClassPathResource("scripts/myscript.sql");
        try(Connection connection = dataSource.getConnection()) {
            ScriptUtils.executeSqlScript(connection, resource);
        } catch (SQLException | ScriptException e) {
            //LOG
        }
    }
}

你知道“Session”与JPA毫无关系吗?这对我来说不起作用,我在创建bean时遇到了一个异常:
java.lang.IllegalStateException:没有可用的事务EntityManager