2013-05-19 6 views
0

Я использую PostgreSQL, и я пытаюсь запустить простое приложение Hibernate, в частности приложение, описанное в page. Мой файл hibernate.cfg.xml является:Hibernate не создает таблицу в базе данных

<?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="hibernate.connection.driver_class">org.postgresql.Driver</property> 
     <property name="hibernate.connection.url">jdbc:postgresql:testDB2</property> 
     <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property> 
     <property name="hibernate.connection.username">postgres</property> 
     <property name="hibernate.connection.password">user</property> 


     <property name="connection.pool_size">1</property> 
     <property name="hibernate.show_sql">true</property> 
     <property name="hibernate.hbm2dll.auto">create</property> 
     <property name="current_session_context_class">thread</property> 
     <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 
     <!-- <property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property> --> 

     <mapping class="com.al.hibmaventest.Department"/> 
     <mapping class="com.al.hibmaventest.Employee"/> 
    </session-factory> 
</hibernate-configuration> 

Мои pom.xml (при использовании Maven) является:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.al.hibmaventest</groupId> 
    <artifactId>HibMavenTest</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 

    <dependencies> 
    <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate</artifactId> 
      <version>3.2.6.ga</version> 
     </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-annotations</artifactId> 
     <version>3.3.1.GA</version> 
    </dependency> 
    <dependency> 
    <groupId>postgresql</groupId> 
    <artifactId>postgresql</artifactId> 
    <version>9.1-901.jdbc4</version> 
</dependency> 
    </dependencies> 


    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <configuration> 
      <source>1.7</source> 
      <target>1.7</target> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 

</project> 

Я использую main(), как в ссылке:

public static void main(String[] args) { 

     SessionFactory sf = HibernateUtil.getSessionFactory(); 
     Session session = sf.openSession(); 
     session.beginTransaction(); 

     Department department = new Department(); 
     department.setDepartmentName("Sales"); 
     session.persist(department); 

     Employee emp1 = new Employee("Nina", "Mayers", "111"); 
     Employee emp2 = new Employee("Tony", "Almeida", "222"); 

     emp1.setDepartment(department); 
     emp2.setDepartment(department); 

     session.persist(emp1); 
     session.persist(emp2); 

     session.getTransaction().commit(); 
     session.close(); 

    } 

Однако невозможно получить работу приложения, а именно, сделать hibernate, создать таблицы в базе данных и вставить значение. Я получаю всегда, что бы я ни пытался, та же ошибка:

INFO: Not binding factory to JNDI, no JNDI name configured 
Hibernate: insert into Department (DEPT_NAME) values (?) 
Mai 19, 2013 6:56:49 PM org.hibernate.util.JDBCExceptionReporter logExceptions 
WARNING: SQL Error: 0, SQLState: 42P01 
Mai 19, 2013 6:56:49 PM org.hibernate.util.JDBCExceptionReporter logExceptions 
SEVERE: ERROR: relation "department" does not exist 
    Position: 13 
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not insert: [com.al.hibmaventest.Department] 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) 
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:40) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2163) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2643) 
    at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:51) 
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279) 
    at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:298) 
    at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181) 
    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:107) 
    at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:131) 
    at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:87) 
    at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:38) 
    at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:618) 
    at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:592) 
    at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:596) 
    at com.al.hibmaventest.Main.main(Main.java:25) 
Caused by: org.postgresql.util.PSQLException: ERROR: relation "department" does not exist 
    Position: 13 
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2102) 
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1835) 
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:500) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:334) 
    at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:73) 
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:33) 
    ... 14 more 

«Отдел отношений не существует» на линии:

session.persist(department); 

Я пробовал без maven, а также, точно такой же ошибки. Чтобы упредить некоторых читателей, в базе данных никогда не создается таблица (отношение) «department». Даже если я создам его вручную в базе данных (что ожидается спящий режим), ошибка остается прежней. Я думаю, что это проблема при создании сеансов или в базе данных widhe.

PostgreSQL нужна конфигурация для принятия Hibernate подключение ?. Может ли проблема возникнуть из JNDI, поскольку в сообщении говорится: «Не привязана фабрика к JNDI, нет JNDI-имени?»?

Любые предложения?

ответ

12

Недвижимость hibernate.hbm2ddl.auto, а не hibernate.hbm2dll.auto.

DDL = Data Definition Language

DLL = Dynamically Loaded Library

+0

Да! Это, наконец, работает! У меня была эта проблема в течение месяца, и я не мог ее найти. Я задал еще один вопрос на сайте, но я получил нерегулярные ответы вроде: «Вы должны создать таблицу вручную» и так далее. Если бы я мог пожертвовать вам 200 очков, я бы сделал это. Благодарю. – arjacsoh

+0

@arjacsoh: в вашем другом вопросе вы сделали ** не ** покажите нам свой 'hibernate.cfg.xml' (и я до сих пор считаю, что таблицы базы данных должны создаваться с использованием управляемого скрипта, а не какого-то« волшебного »внутри ОРМ) –

1

Вопрос был правильно ответил. Кстати, я хотел бы что-то добавить. Вы кладете

<property name="hibernate.connection.username">postgres</property> 
     <property name="hibernate.connection.password">user</property> 

Это не хороший вариант, чтобы изменить Postgres пароль по умолчанию (он несет проблемы безопасности), и это не безопасно, используя пользователя Postgres в качестве владельца в БД. Для получения дополнительной информации см. Следующую ссылку: https://serverfault.com/questions/110154/whats-the-default-superuser-username-password-for-postgres-after-a-new-install/325596#325596 Извините за это нарушение, но я думаю, что это может быть полезно.

Смежные вопросы