问题描述
我正在使用 PostgreSQL 并创建名为 hib 的表和模式。 当我在 db 中创建外星表并运行应用程序时,它成功地将数据保存到数据库中。 但是,如果数据库中不存在该表,则 Hibernate 不会在 hib 模式内创建表,我认为 hibernate 不会读取 hibernate.cfg.xml 中提到的 hdm2ddl.auto 属性。 根据日志,它不提供诸如创建或更新表之类的日志(如果存在)。 它直接尝试插入值。 尝试了很多方法,但它不像创建、更新、创建删除那样工作。 每次相同的错误错误:关系“hib.alien”不存在。 这是持久类。
@Entity()
@Table(name="hib.alien")
public class Alien {
@Id
private int aid;
private String aname;
private String acolor;
public Alien() {}
public Alien(int aid, String aname, String acolor) {
this.aid = aid;
this.aname = aname;;
this.acolor = acolor;
}
public int getAid() {
return aid;
}
public void setAid(int aid) {
this.aid = aid;
}
public String getAname() {
return aname;
}
public void setAname(String aname) {
this.aname = aname;
}
public String getAcolor() {
return acolor;
}
public void setAcolor(String acolor) {
this.acolor = acolor;
}
@Override
public String toString() {
return "Alien [aid=" + aid + ", aname=" + aname + ", acolor=" + acolor + "]";
}
}
hibernate.cfg.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hbm2ddl.auto">update</property>
<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
<property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/hib</property>
<property name="hibernate.connection.username">postgres</property>
<property name="hibernate.connection.password">123</property>
<property name="show_sql">true</property>
</session-factory>
</hibernate-configuration>
和主类
public class App
{
public static void main( String[] args )
{
Alien alien = new Alien(1, "Nagaraj Kharvi", "Red");
System.out.println(alien);
Configuration con = new Configuration().configure().addAnnotatedClass(Alien.class);
SessionFactory sf = con.buildSessionFactory();
Session s = sf.openSession();
Transaction tx = s.beginTransaction();
s.save(alien);
tx.commit();
}
}
这是日志:
INFO: HHH000400: Using dialect: org.hibernate.dialect.PostgreSQLDialect
Mar 03, 2019 10:28:08 AM org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator initiateService
INFO: HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
Hibernate: insert into hib.alien (acolor, aname, aid) values (?, ?, ?)
Mar 03, 2019 10:28:09 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 0, SQLState: 42P01
Mar 03, 2019 10:28:09 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: ERROR: relation "hib.alien" does not exist
Position: 13
Mar 03, 2019 10:28:09 AM org.hibernate.internal.ExceptionMapperStandardImpl mapManagedFlushFailure
ERROR: HHH000346: Error during managed flush [org.hibernate.exception.SQLGrammarException: could not execute statement]
Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute statement
1楼
对于 PostgreSQL 实体应该如下所示,因此该表将在该模式中创建。
@Entity()
@Table(name = "alien" schema = "\"hib\"")
public class Alien {
@Id
private int aid;
public int getAid() {
return aid;
}
public void setAid(int aid) {
this.aid = aid;
}
}