web-dev-qa-db-ja.com

HibernateはDBに存在しないテーブルを自動作成しません

基本的なHibernateコードがあり、プロパティ「hibernate.hbm2ddl.auto」を更新として設定しましたが、データベースにテーブルを自動作成していません。

必要なファイルは次のとおりです。

employee.hbm.xml

<hibernate-mapping>
  <class name="contacts.employee" table="contacts">
      <meta attribute="class-description"></meta>
    <id column="contactId" name="contactId" type="string">
      <generator class="assigned"/>
    </id>
    <property column="contactName" length="100" name="contactName" not-null="true" type="string"/>
    <property column="password" length="100" name="password" not-null="true" type="string"/>
    <set cascade="all" name="groupOfResponsibilities" table="employee_responsibilty">
      <key column="contactId"/>
      <many-to-many class="contacts.responsibilities" column="responsibilityId"/>

    </set>

  </class>
</hibernate-mapping>

substitution.hbm.xml

<hibernate-mapping>
  <class name="contacts.responsibilities" table="responsibilities">
    <meta attribute="class-description">
        This class list of responsibilities if an employee
    </meta>
    <id column="responsibilityId" name="responsibilityId" type="long">
      <generator class="increment"/>
    </id>
    <property column="responsibilityName" name="responsibilityName" type="string"/>
  </class>
</hibernate-mapping>

hibernate.cfg.xml

<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/****</property>
    <property name="hibernate.connection.username">*****</property>
    <property name="hibernate.connection.password">*****</property>
    <property name="hibernate.hbm2ddl.auto">update</property>
    <property name="hibernate.show_sql">true</property>
    <mapping resource="contacts/employee.hbm.xml"/>
    <mapping resource="contacts/responsibilitiy.hbm.xml"/>
  </session-factory>
</hibernate-configuration>

これは私が実行しようとしているMain.Javaです:

public class Main {

    public static void main(String[] args) {

        SessionFactory sessionfactory = NewHibernateUtil.getSessionFactory();
        Transaction transaction = null;
        try {
            Session session = sessionfactory.openSession();
            transaction = session.beginTransaction();
            Set<responsibilities> groups = new HashSet<responsibilities>();
            responsibilities responsibilityOne=new responsibilities("Java");
            responsibilities responsibilityTwo=new responsibilities("SQL");
            responsibilities responsibilityThree=new responsibilities("Oracle");
            groups.add(responsibilityOne);
            groups.add(responsibilityTwo);
            groups.add(responsibilityThree);
            String uuid = UUID.randomUUID().toString();
            String uuid2 = UUID.randomUUID().toString();
            employee firstEmployee;
            firstEmployee = new employee(uuid, "Mike", groups);
            employee secondEmployee = new employee(uuid2, "Marc", groups);
            session.save(responsibilityOne);
            session.save(responsibilityTwo);
            session.save(responsibilityThree);
            session.save(firstEmployee);
            session.save(secondEmployee);

            transaction.commit();
        } catch (HibernateException e) {
            transaction.rollback();
            e.printStackTrace();
        } finally {

        }

    }
}

これは私が得るエラーです:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:テーブル '* *。roles'は存在しません

21
Nick Div

私は同じ問題を抱えていた、これは私のために働いた-

<property name="hibernate.hbm2ddl.auto">create</property>
19

次のシナリオは、Hibernateがテーブルを自動作成できないもう1つの理由です。

@Entity
public class Employee {
  @Id
  @GeneratedValue
  private String empID;
  private String name;
}   

EmployeeempIDであり、@GeneratedValue注釈があるため、テーブルStringはHibernateによって自動作成されません。 empIDintまたはlongでなければなりません。いつかこの問題が発生し、@GeneratedValueアノテーションを持つidフィールドをint型に変更し、Hibernateがテーブルを自動作成しました。

16
Kihats

私は同じ問題を抱えていたので、変更して解決しました:

org.hibernate.dialect.MySQLInnoDBDialect

org.hibernate.dialect.MySQLDialect

この質問 で解決策を見つけました。

11
Carloso
  1. まず、$mysql --version $mysql Ver 14.14 Distrib 5.5.11でMySQLバージョンを確認します

次に、方言を適宜変更します

  1. 次に、方言プロパティを変更します/この例では、MySQL55Dialect/ org.hibernate.dialect.MySQL55Dialectを指定しました

/////////////////////////////////////////////////-方言を見つけることができます:

org.hibernate.dialect
try 
import org.hibernate.dialect.ctrl+space
you find option

このヘルプを願っています

2
Dipayan Das

代わりにcreateまたはcreate-dropを試してみませんか。あなたの目的に役立つようです。 http://docs.jboss.org/hibernate/core/3.3/reference/en/html/session-configuration.html#configuration-optional

2
urug

私は同じ問題を抱えていましたが、私にとっての解決策は次のとおりでした:

<property name="hibernate.hbm2ddl.auto">create-drop</property>

の代わりに

<property name="hibernate.hbm2ddl">create-drop</property>
1
Cristi B.

正しい設定をするだけ

1)新しいテーブルが作成されるたびに作成します。古いデータはすべて削除されます。

<property name="hibernate.hbm2ddl.auto">create</property>

2)更新、変更が行われた場合、DBに反映されます。

<property name="hibernate.hbm2ddl.auto">update</property>
0
Angad Bansode

既存の作業環境、または大きなアプリケーション領域の場合、そのままhibernate.hbm2ddl.autoon createまたはcreate-dropを設定することは推奨されません下に示された

<property name="hibernate.hbm2ddl.auto">create-drop</property>

動作しますが、サーバーを再起動するたびにデータベースの既存のテーブルがすべて削除されます。

hibernate jarバージョン5.2.0を使用している場合は、下位バージョンまたは他のバージョンに切り替えてください。このバージョンjarには更新に関する問題があります。

それは私にとってはうまくいきましたし、他の人にとってもうまくいくことを願っています。

0
Prakhar Agrawal

Hibernateはテーブル、Hibernateシーケンス、および多対多マッピングに使用されるテーブルを作成できますが、ConfigurationオブジェクトのsetProperty( "hibernate.hbm2ddl.auto"、 "create")を呼び出して明示的に構成する必要があります。デフォルトでは、DBを使用してスキーマを検証し、「ORA-00942:テーブルまたはビューが存在しません」というエラーを表示して、まだ存在しない場合は失敗します。

0
Ashish Sharma