JPAとHibernateは初めてです。いくつかのオンライン資料を読んだ後、Hibernateとは何か、JPAでHibernateを使用する方法を理解しました。
今、私はこれを実行しようとしています JPA&Hibernate tutorial 。私は彼らがこのチュートリアルで言及するすべてをしました。
Oracle DBはなく、MySQLしかありません。それで、JPAとHibernateの理解を使ってpersistence.xml
にいくつかの変更を加えました(それが正しいかどうかはわかりません...どうやらそうです。)
これが私のpersistence.xml
です
<persistence xmlns="http://Java.Sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://Java.Sun.com/xml/ns/persistence http://Java.Sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
<persistence-unit name="customerManager" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>Customer</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="1234"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/general"/>
<property name="hibernate.max_fetch_depth" value="3"/>
</properties>
</persistence-unit>
</persistence>
しかし、私は彼らが説明する出力を取得していないようです。それは私に与えています:
Customer id before creation:null
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named customerManager
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.Java:55)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.Java:33)
at CustomerDAO.create(CustomerDAO.Java:8)
at CustomerDAO.main(CustomerDAO.Java:22)
あらゆる提案を歓迎します。
更新:
私は行うように求められている変更を加えました。しかし、まだasmeエラー行が表示されます!!!
彼らはそのチュートリアルでorm.xmlについて何も言及していませんでした。問題の原因かもしれません!!!
persistence.xml
は無効であり、EntityManagerFactory
を作成できません。そのはず:
<persistence xmlns="http://Java.Sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://Java.Sun.com/xml/ns/persistence http://Java.Sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
<persistence-unit name="customerManager" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>Customer</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="1234"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/general"/>
<property name="hibernate.max_fetch_depth" value="3"/>
</properties>
</persistence-unit>
</persistence>
(<property>
要素がどのように閉じられるかに注意してください、それらはネストされてはいけません
更新:チュートリアルを進めましたが、MySQLを使用する場合はId
生成戦略も変更する必要があります(MySQLはシーケンスをサポートしないため)。 AUTO
戦略(デフォルトではMySQLのIDENTITY)を使用することをお勧めします。これを行うには、SequenceGenerator
注釈を削除し、次のようにコードを変更します。
@Entity
@Table(name="TAB_CUSTOMER")
public class Customer implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="CUSTOMER_ID", precision=0)
private Long customerId = null;
...
}
これが役立つはずです。
PS:提案どおりlog4j.properties
も提供する必要があります。
完全を期すためだけに。このエラーを引き起こす別の状況があります:
mETA-INF/services/javax.persistence.spi.PersistenceProviderファイルがありません。
Hibernateの場合、hibernate-entitymanager-XXX.jar
、したがって、hibernate-entitymanager-XXX.jar
はクラスパスにありません。このエラーも発生します。
このエラーメッセージは非常に誤解を招くものであり、修正するには数時間かかります。
プロバイダーとしてHibernateを使用するJPA 2.0-例外:EntityManagerの永続プロバイダーなし を参照してください。
今日も同じ問題がありました。 persistence.xmlが間違った場所にありました。次のパスに配置する必要がありました。
project/src/main/resources/META-INF/persistence.xml
私は同じ問題に直面していました。 persistence.xmlで間違ったプロバイダークラスを使用していることに気付きました
Hibernateの場合は、
<provider>org.hibernate.ejb.HibernatePersistence</provider>
EclipseLinkの場合は
<provider>org.Eclipse.persistence.jpa.PersistenceProvider</provider>
Hibernate 5.2.10.Finalを使用する場合は、変更する必要があります
<provider>org.hibernate.ejb.HibernatePersistence</provider>
に
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
persistence.xmlで
Mavenを使用している場合、bothsrc/{main,test}/resources/META-INF/persistence.xml
。これは一般的なセットアップです。h2またはDerbyでJPAコードをテストし、PostgreSQLまたはその他の完全なDBMSでデプロイします。このパターンを使用している場合、2つのファイルにdifferentユニット名が含まれていることを確認してください。そうしないと、Persistence
クラスの一部のバージョンが両方をロードしようとします(もちろん、 time CLASSPATHにはクラスとテストクラスの両方が含まれます);これは、永続性ユニットの矛盾する定義を引き起こし、その結果、私たち全員が大いに嫌う恐ろしい迷惑なメッセージをもたらします!
さらに悪いことに、これは、Hibernateなどの一部の古いバージョンでは「機能する」可能性がありますが、現在のバージョンでは失敗します。とにかくそれを正しくする価値がある...
少し遅すぎましたが、同じ問題が発生し、persistence.xmlファイル(行1)でschemalocationをschemaLocationに切り替えて修正しました。
Tomcat 8でJPAエンティティマネージャーを構成しようとしたときにも同じ問題に直面していました。最初にSystemExceptionクラスが見つからないという問題があり、entityManagerFactoryが作成されていませんでした。 hibernateエンティティマネージャーの依存関係を削除した後、entityManagerFactoryが永続化プロバイダーを検索できませんでした。多くの調査を経て、Hibernateエンティティマネージャーが何らかの構成を検索する必要があることを知るようになりました。次に、エンティティマネージャjarを戻し、JTA Apiを依存関係として追加しましたが、正常に機能しました。
私はこのエラーを見ました、私にとって問題はpersistance.xmlの絶対パスにスペースがあったということで、同じものを取り除くことは私を助けました。