0

私は休止状態の技術を使ったプロジェクトに取り組んでいます。POJO クラスを hibernate reveng システムから取得し、データベース プロセスを保存してプロジェクトのセットアップをテストしようとしました。ここで、「挿入できませんでした: [tables.Users]」エラーが発生します。必要なクラスを共有します。これはデータベースクラスを保存しています。

static boolean SaveDatabase(Users object) {


    Session session = null;
    try {

        session = HibernateUtil.getSessionFactory().openSession();
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();
            session.save(object);
            transaction.commit();
        } catch (Exception e) {
            transaction.rollback();
            System.out.println(e.getMessage());
            return false;
        }
    } finally {
        session.close();
    }
    return true;
}

私の構成とテーブルクラスは正しいです。これはテストクラスです。

public class Test {
public static void main(String[] args) {
    // Test RegisterUser and GetUsersWithId in here

    LogIn test = new LogIn();
    Users user = new Users();

    user.setUserEmail("email");
    user.setUserAdress("adres here");
    user.setUserFbId(3);
    test.RegisterUsers(user);
}
}

そして、これはスタックトレースです:

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
could not insert: [tables.Users]

テスト プログラムをデバッグ モードで実行すると、 session.save(object); 行で例外が発生し、プログラムが catch ブロックにジャンプします。また、私のトランザクションとセッションは null ではありません。役立つデバッグ モードの写真が 2 枚あります。

クラスをデータベースに渡します。 私はこれらのハッシュセットに詳しくないので、何か問題がある可能性があります。 デバッグが catch ブロックにあるときの変数の値の一部。 e = ここで送信される SQLGrammarException

助けてくれてありがとう。

編集 3: 編集されたスタック トレース

    Hibernate: insert into mobil.mobil.users (UserFbId, UserFbToken, UserName, UserLastName, UserEmail, UserAdress, UserFavouritedTopicsCount, UserCreatedTopicsCount, UserRecommendedTopicsCount, UserFollowingsCount, UserFollowersCount, UserBio, UserProfilePicUrl, UserIsOnline, UserPoint) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
org.hibernate.exception.SQLGrammarException: could not insert: [tables.Users]
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:64)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2176)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2656)
    at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
    at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321)
    at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
    at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
    at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
    at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:563)
    at org.hibernate.impl.SessionImpl.save(SessionImpl.java:551)
    at org.hibernate.impl.SessionImpl.save(SessionImpl.java:547)
    at DAO.LogIn.SaveDatabase(LogIn.java:55)
    at DAO.LogIn.RegisterUsers(LogIn.java:16)
    at Test.main(Test.java:14)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.users (UserFbId, UserFbToken, UserName, UserLastName, UserEmail, UserAdress, Us' at line 1
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.Util.getInstance(Util.java:386)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1053)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2734)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359)
    at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:94)
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57)
    ... 18 more

ハイバネート構成。ファイル :

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
                                         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory name="">
        <property name="hibernate.bytecode.use_reflection_optimizer">false</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.password">diobookbla</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mobil</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.default_schema">mobil</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.search.autoregister_listeners">false</property>
        <mapping class="tables.Users" resource="Users.hbm.xml" />
        <mapping class="tables.Topicrecommend" resource="Topicrecommend.hbm.xml" />
        <mapping class="tables.Posts" resource="Posts.hbm.xml" />
        <mapping class="tables.Location" resource="Location.hbm.xml" />
        <mapping class="tables.Topics" resource="Topics.hbm.xml" />
        <mapping class="tables.Favouritetopics" resource="Favouritetopics.hbm.xml" />
        <mapping class="tables.Postlike" resource="Postlike.hbm.xml" />
        <mapping class="tables.Userfollow" resource="Userfollow.hbm.xml" />
        <mapping class="tables.Mention" resource="Mention.hbm.xml" />
    </session-factory>
</hibernate-configuration>

編集 2: Users.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Dec 11, 2012 4:55:13 PM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="tables.Users" table="users" catalog="mobil">
        <id name="userId" type="java.lang.Integer">
            <column name="UserId" />
            <generator class="identity" />
        </id>
        <property name="userFbId" type="java.lang.Integer">
            <column name="UserFbId" />
        </property>
        <property name="userFbToken" type="string">
            <column name="UserFbToken" />
        </property>
        <property name="userName" type="string">
            <column name="UserName" />
        </property>
        <property name="userLastName" type="string">
            <column name="UserLastName" />
        </property>
        <property name="userEmail" type="string">
            <column name="UserEmail" />
        </property>
        <property name="userAdress" type="string">
            <column name="UserAdress" />
        </property>
        <property name="userFavouritedTopicsCount" type="string">
            <column name="UserFavouritedTopicsCount" />
        </property>
        <property name="userCreatedTopicsCount" type="string">
            <column name="UserCreatedTopicsCount" />
        </property>
        <property name="userRecommendedTopicsCount" type="string">
            <column name="UserRecommendedTopicsCount" />
        </property>
        <property name="userFollowingsCount" type="java.lang.Integer">
            <column name="UserFollowingsCount" />
        </property>
        <property name="userFollowersCount" type="java.lang.Integer">
            <column name="UserFollowersCount" />
        </property>
        <property name="userBio" type="string">
            <column name="UserBio" />
        </property>
        <property name="userProfilePicUrl" type="string">
            <column name="UserProfilePicUrl" />
        </property>
        <property name="userIsOnline" type="java.lang.Boolean">
            <column name="UserIsOnline" />
        </property>
        <property name="userPoint" type="java.lang.Integer">
            <column name="UserPoint" />
        </property>
        <set name="topicses" table="topics" inverse="true" lazy="true" fetch="select">
            <key>
                <column name="TopicUserId" />
            </key>
            <one-to-many class="tables.Topics" />
        </set>
        <set name="mentionsForMentionedId" table="mention" inverse="true" lazy="true" fetch="select">
            <key>
                <column name="MentionedId" />
            </key>
            <one-to-many class="tables.Mention" />
        </set>
        <set name="favouritetopicses" table="favouritetopics" inverse="true" lazy="true" fetch="select">
            <key>
                <column name="UserId" />
            </key>
            <one-to-many class="tables.Favouritetopics" />
        </set>
        <set name="mentionsForMentionerId" table="mention" inverse="true" lazy="true" fetch="select">
            <key>
                <column name="MentionerId" />
            </key>
            <one-to-many class="tables.Mention" />
        </set>
        <set name="postlikes" table="postlike" inverse="true" lazy="true" fetch="select">
            <key>
                <column name="UserId" />
            </key>
            <one-to-many class="tables.Postlike" />
        </set>
        <set name="userfollowsForFollowingId" table="userfollow" inverse="true" lazy="true" fetch="select">
            <key>
                <column name="FollowingId" />
            </key>
            <one-to-many class="tables.Userfollow" />
        </set>
        <set name="topicrecommends" table="topicrecommend" inverse="true" lazy="true" fetch="select">
            <key>
                <column name="UserId" />
            </key>
            <one-to-many class="tables.Topicrecommend" />
        </set>
        <set name="userfollowsForFollowerId" table="userfollow" inverse="true" lazy="true" fetch="select">
            <key>
                <column name="FollowerId" />
            </key>
            <one-to-many class="tables.Userfollow" />
        </set>
    </class>
</hibernate-mapping>
4

1 に答える 1

1

OK、問題はどこにあるのかわかりました。接続文字列で正しいデータベースを選択したため、mobil.mobil.usersナンセンスです。mobil.users正しく、また機能します。users

データベース名を少なくとも 3 回定義しました。

  1. 接続文字列で:<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mobil</property>

  2. デフォルトのスキーマとして:<property name="hibernate.default_schema">mobil</property>

  3. クラス マッピングのカタログとして:<class name="tables.Users" table="users" catalog="mobil">

接続文字列 (1.) でデータベース名を定義するだけで十分です。2. と 3. の両方を削除できます。2 つのうち少なくとも 1 つを削除する必要があります。


ロギングの疑問符に対する 1 つのコメント: Hibernate は sql ログに具体的な値を表示しません。常に疑問符が表示されます。これは、JDBC の制限によるものです。それにもかかわらず、正しい値がデータベースに渡されます。実際の値を確認したい場合は、log4jdbc などの別の JDBC ロギング ユーティリティを使用する必要があります。

于 2013-01-11T08:31:32.543 に答える