Java Persistence APIとHibernateに問題があります。プロジェクトの状況は次のとおりです。
私の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_2_0.xsd"
version="2.0">
<persistence-unit name="JPA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>com.david.Libro</class>
<class>com.david.Categoria</class>
<properties>
<property name="hibernate.show_sql" value="true" />
<property name="javax.persistence.transactionType" value="RESOURCE_LOCAL" />
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/arquitecturaJava" />
<property name="javax.persistence.jdbc.user" value="root" />
<property name="javax.persistence.jdbc.password" value="root" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
</properties>
</persistence-unit>
</persistence>
そして、私はEntityManagerFactoryを作成します:
private static EntityManagerFactory buildEntityManagerFactory()
{
try
{
return Persistence.createEntityManagerFactory("JPA");
}
catch (Throwable ex)
{
ex.printStackTrace();
//throw new RuntimeException("Error al crear la factoria de JPA:->"+ ex.getMessage());
}
}
私のエラーは、EntityManagerFactoryの作成に関するものです。
javax.persistence.PersistenceException: [PersistenceUnit: JPA] Unable to build EntityManagerFactory
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.Java:924)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.Java:899)
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.Java:59)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.Java:63)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.Java:47)
at com.david.JPAHelper.buildEntityManagerFactory(JPAHelper.Java:14)
at com.david.JPAHelper.<clinit>(JPAHelper.Java:8)
at com.david.Categoria.buscarTodos(Categoria.Java:93)
at com.david.FormularioInsertarLibroAccion.ejecutar(FormularioInsertarLibroAccion.Java:25)
at com.david.ControladorLibros.doGet(ControladorLibros.Java:38)
at javax.servlet.http.HttpServlet.service(HttpServlet.Java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.Java:728)
at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:305)
at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:210)
at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:222)
at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:123)
at org.Apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.Java:472)
at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:171)
at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:99)
at org.Apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.Java:947)
at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:118)
at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:408)
at org.Apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.Java:1009)
at org.Apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.Java:589)
at org.Apache.Tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.Java:310)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at Java.lang.Thread.run(Unknown Source)
Caused by: org.hibernate.DuplicateMappingException: Duplicate class/entity mapping com.david.Libro
at org.hibernate.cfg.Configuration$MappingsImpl.addClass(Configuration.Java:2638)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.Java:706)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.Java:3512)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.Java:3466)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.Java:1355)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.Java:1756)
at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.Java:96)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.Java:914)
... 27 more
LibroおよびCategoriaクラスのコードの一部は次のとおりです。
@Entity
@Table(name = "Categorias")
public class Categoria implements Serializable
{
private static final long serialVersionUID = 1L;
@Id
@JoinColumn(name = "categoria")
private String id;
private String descripcion;
....
そして
@Entity
@Table(name="Libros")
public class Libro implements Serializable
{
private static final long serialVersionUID = 1L;
@Id
private String isbn;
private String titulo;
@ManyToOne
@JoinColumn (name="categoria")
private Categoria categoria;
....
Hibernate Configurationの私のファイルは次のとおりです。
<?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>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost/arquitecturajava</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="connection.pool_size">5</property>
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<property name="show_sql">true</property>
<mapping class="com.david.Categoria"></mapping>
<mapping class="com.david.Libro"></mapping>
</session-factory>
</hibernate-configuration>
何か案は!!ありがとう!!
この場合、hibernate.cfg.xml
とpersistence.xml
の両方は必要ありません。 hibernate.cfg.xml
を削除して、すべてをpersistence.xml
のみにマッピングしようとしましたか?
しかし、他の答えも指摘しているように、これはこのように大丈夫ではありません:
@Id
@JoinColumn(name = "categoria")
private String id;
代わりに@Column
を使用しませんでしたか?
Categoria
クラスのIDフィールドで@JoinColumn(name="categoria")
を非表示にすると、うまくいくと思います。
PaymentenginePU永続性ユニットのコンテナエンティティマネージャファクトリを作成しようとしたときに、誰かが:-org.hibernate.jpa.HibernatePersistenceProvider永続性プロバイダに直面している場合は、上記のアノテーションを使用します。次のエラーが発生しました:[PersistenceUnit:paymentenginePU] Hibernate SessionFactoryを構築できません**これは、Audit table。@ Auditを使用している場合の解決策です
使用:-スーパークラスで@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED).
次の依存関係をpomに追加した後、私にとってはうまくいきました。
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.3.0.Final</version>
</dependency>