Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.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 Postgresql JPA Hibernate创建数据库_Java_Spring_Hibernate_Postgresql_Jpa - Fatal编程技术网

Java Postgresql JPA Hibernate创建数据库

Java Postgresql JPA Hibernate创建数据库,java,spring,hibernate,postgresql,jpa,Java,Spring,Hibernate,Postgresql,Jpa,我在使用带有JPA Hibernate的Postgresql时遇到问题 我的代码: @Transactional public void createDatabase(User user) { Query q = em.createNativeQuery("CREATE USER \"" + user.getEmail() + "\" WITH PASSWORD '" + user.getPasswordHash() + "' ;"); q.execute

我在使用带有JPA Hibernate的Postgresql时遇到问题

我的代码:

@Transactional
public void createDatabase(User user) {
    Query q = em.createNativeQuery("CREATE USER \"" + user.getEmail()
            + "\" WITH PASSWORD '" + user.getPasswordHash() + "' ;");
    q.executeUpdate();
    Query q1 = em.createNativeQuery("CREATE DATABASE " + user.getDb() + ";");
    q1.executeUpdate();
    Query q2 = em.createNativeQuery("GRANT ALL PRIVILEGES ON " + user.getDb()
            + " TO '" + user.getEmail() + "';");
    q2.executeUpdate();
}
我有以下错误

Hibernate: CREATE USER "test" WITH PASSWORD 'test' ;
Hibernate: CREATE DATABASE test;
2015-05-08 15:15:49.531  WARN 1952 --- [nio-8080-exec-6] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: 25001
2015-05-08 15:15:49.531 ERROR 1952 --- [nio-8080-exec-6] o.h.engine.jdbc.spi.SqlExceptionHelper   : ERREUR: CREATE DATABASE cannot be created in a transaction bloc
2015-05-08 15:15:49.545 ERROR 1952 --- [nio-8080-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not execute statement] with root cause

org.postgresql.util.PSQLException: ERREUR: CREATE DATABASE cannot be created in a transaction bloc
如果删除事务注释,则会出现以下错误:

javax.persistence.TransactionRequiredException: Executing an update/delete query
    at org.hibernate.jpa.spi.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:71)
    at com.esisa.pfe.business.DefaultUserService.createDatabase(DefaultUserService.java:56)
    at com.esisa.pfe.controllers.ClientController.addAbonnement(ClientController.java:69)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
对象不是创建新数据库或用户的对象。请参阅使用实体管理器的文档。如果您想从java创建一个新的数据库,可以使用简单的JDBC来实现-下面是一些示例代码:

// without db name
public static final String HOST = "jdbc:postgresql://localhost:5432/";

Statement stmt = conn.createStatement();
stmt.executeUpdate("CREATE DATABASE JavaDB");
stmt.executeUpdate("CREATE USER java_user WITH PASSWORD  \'java\'");
// ...
对象不是创建新数据库或用户的对象。请参阅使用实体管理器的文档。如果您想从java创建一个新的数据库,可以使用简单的JDBC来实现-下面是一些示例代码:

// without db name
public static final String HOST = "jdbc:postgresql://localhost:5432/";

Statement stmt = conn.createStatement();
stmt.executeUpdate("CREATE DATABASE JavaDB");
stmt.executeUpdate("CREATE USER java_user WITH PASSWORD  \'java\'");
// ...

创建EntityManagerFactory时,JPA 2.1允许您创建数据存储表等(可选模式也取决于JPA实现和数据存储)。

JPA 2.1允许您创建数据存储表等(可选模式也取决于JPA实现和数据存储)创建EntityManagerFactory时。

我已经在MySQL下实现了这一点,现在我切换到Postgresql,它不再工作了,我在Springboot下使用JPA Hibernate,因此没有JDBC。提到的代码是在本地测试的,所以应该可以工作。正如我所说的,JPA/Hibernate是一个假设DB已经就位的框架,而不是创建新数据库和用户的API。JDBC是JDK的一部分,所以您可以使用它。Spring也有jdbc部件可供使用-@Zouazou:在运行
create database
语句之前,需要打开autocommit。我已经在MySQL下实现了这一点,但现在我切换到Postgresql,它不再工作了,我正在Springboot下使用JPA Hibernate,所以没有JDBC。上面提到的代码是在本地测试的,所以应该可以工作。正如我所说的,JPA/Hibernate是一个假设DB已经就位的框架,而不是创建新数据库和用户的API。JDBC是JDK的一部分,所以您可以使用它。Spring还可以使用jdbc部件-@Zouazou:在运行
createdatabase
语句之前,需要打开autocommit。