1. ホーム
  2. Database

Hibernateでhibernate.propertiesが見つからない問題とデータベース方言の更新の問題

2022-02-07 13:30:51
<パス

この2日間、この問題を解決してきただけでなく、多くの情報を参照して、それは本当に心が痛いです。今ようやくデバッグが完了し、過大なブログが投稿されるに違いない!

まず最初に、私はHibernate 5.2とMySQL 5.7を使用しています!
要点を言えよ!!! ---------- ---------- ---------- *

バージョンによって使用するメソッドが違う! オーナーは、異なるバージョンで異なるメソッドと名前を使用して、これらの上に死んでいる! プログラマーはHibernate、SQLのバージョンを確認してください! そうしないと、私のように、何度も死ぬが、抜け出せないことになる。

---------- ---------- ---------- -----

まず、not found問題について、いろいろなところを参考にし、以下の2点にまとめました。

1 コードに論理的な誤りや構文上の誤りがないのに、NOT FOUND プロンプトが表示される場合

. このヒントは無視してかまいません(すべてのコードが正しく、cfgファイルの関連付けが正しい場合)。これは、修正しなければならないエラーではなく、警告と考えることができます。

なぜなら、Hibernate 内部では、properties ファイルと cfg.xml ファイルの両方が設定に使用されますが、Hibernate ファイルがデフォルトで最初に見るのは xml 設定、xml ファイルがあればプロパティは見ない、properties ファイルは hibernate の古いバージョンで使用されるからです。そこで、xmlファイルを設定すると、プロンプトを無視できるようになります。今、動作しているときと同じように、やはりこのプロンプトが表示されます。

2 コードにエラーが発生した場合は、以下の対処法をご参照ください。

どこがエラーなのか分からないので、自分で設定ファイルなどを貼って照らし合わせています。

2.1 まず、ファイルの場所がうまく配置されている必要があります。
student.hbm.xmlファイルとstudent.javaファイルは、できれば1つのパッケージの下に配置するのが望ましいです。そして、hibernate.cfg.xml は src ファイルの下に配置する必要があります。なぜなら、トークバック・ファクトリーを作成するときに cfg ファイルへのパスを記述しないと、システムはデフォルトで src ファイルに移動して設定ファイルを見つけるからです。(自分でパスを書きたい人は問題ありませんが、私はパスを書きません......というより面倒でエラーになりやすいので)
というわけで、私のファイルは、写真のように配置されています。


jar パッケージと mysql ドライバをすべて hibernate/required file yo の下にインポートすることを忘れないようにします。

2.2 hibernate.cgf.xlmの設定

<?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>
<! -- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost/db</property>
<property name="connection.username">root</property>
<property name="connection.password">11111</property>
<! -- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<! -- SQL dialect Note that the new version of MYSQL5.7 dialect is org.hibernate.dialect.MySQL5InnoDBDialect Don't get it wrong! You can't get it wrong here -->
    <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<! -- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>
<! -- Echo all executed SQL to stdout -->
<property name="hibernate.format_sql">true</property>
<property name="show_sql">true</property>
<! -- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">create</property>
<property name="current_session_context_class">thread</property>
<mapping class="config.student"/>
<mapping resource="config/student.hbm.xml"/>
</session-factory>
</hibernate-configuration>


コンフィギュレーション・ファイルで見るべき場所は

<mapping resource="config/student.hbm.xml"/> and
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>


この2つの文章は、今 MYSQL 5.7 の方言表現には注意が必要です . また、設定ファイルの関連付けについては、パッケージ下のファイル同士は スラッシュ をドットで囲むのではなく

2.3 student.hmb.xml

<?xml version="1.0"? >
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<! -- Generated 2018-8-23 13:22:25 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="config.student" table="student">
    <id name="id" >
        <column name='s_id'></column>
    </id>
    <property name="name" >
        <column name="name"></column>
    </property>
    <property name="sex" >
        <column name='sex'></column>
    </property>
</class>
</hibernate-mapping>



ここで注目すべきは、このフレーズです。
" http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd ">
ネットで見かけるバージョンは基本的に
" http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd ">
デバッグしていると、プロンプトが「2番目の式は破棄されました」と表示し、現在は1番目の式を使っています。

2.4 student.java

package config;
public class student {
private int id;
private String name;
private String sex;
public student(int a,String b,String c)
{
this.id=a;
this.name=b;
this.sex=c;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}


2.5 studenttest.java

package test;
import static org.junit.Assert.*;
import org.hibernate;
import org.hibernate;
import org.hibernate.Transaction;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg;
import org.hibernate.service.ServiceRegistry;
import org.junit;
Before;
import org.junit;

import config.student;
public class studenttest {
@Test
public void testSaveStudents() {
    student student = new student(2,"Peppa Pig","female");
SessionFactory sf=new Configuration().configure().buildSessionFactory();
    Session session=sf.openSession();
    session.beginTransaction();
    session.save(student);
    session.getTransaction().commit();
    session.close();
    sf.close();
    }
}
The most important thing here is to create the session factory.
The method of creation is completely different from version to version. hibernate 4\5 has a completely different method of creation. Some methods are deprecated. Here I can guarantee that this method will work for Hibernate 5.2, 5.3 should also work but I haven't tried it.


以下に公式の作成方法を掲載します(公式ユーザーガイドにある方法で作成したところ、トークバックファクトリーでうまくいかず、非常に悔しい思いをしました。ぜひ試してみて、うまくいったら教えてください)
例4. org.hibernate.SessionFactory の取得

protected void setUp() throws Exception {...
// SessionFactoryはアプリケーションに対して一度だけセットアップされます!
    final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
        .configure() // hibernate.cfg.xml から設定を構成する。
        .ビルド();
トライ {
    sessionFactory = new MetadataSources( registry ).buildMetadata().buildSessionFactory();

キャッチ (例外 e) {
    // レジストリはSessionFactoryによって破壊されるはずだが、SessionFactoryの構築に問題があった。
    // だから手動で破壊する。
    StandardServiceRegistryBuilder.destroy( registry );
}
}


例6.エンティティ一覧の取得

session = sessionFactory.openSession();
session.beginTransaction();
List result = session.createQuery( "from Event" ).list();
for ( Event event : (List<Event>) result ) {
    System.out.println( "Event (" + event.getDate() + ") : " + event.getTitle() );
}
session.getTransaction().commit();
session.close();


もし、私が言っていることがよくわからないなら、この立派な人が書いた文章を読んでみてください。
https://bbs.csdn.net/topics/391955731