У меня очень простой случай с ссылкой eclipse, которую я воспроизвел ниже. Если я смогу получить приведенный ниже пример работы, то я могу легко применить его к рассматриваемому фактическому делу. Проблема в том, что я не могу!EclipseLink не может найти сущность в отношениях OneToMany
Существует два класса - Parent
и Child
. Оба имеют идентификатор String
, а Parent
содержит список Child
объектов в поле children
. List
детей имеет атрибут @OneToMany
, и оба класса имеют атрибут @Entity
. Я запускаю все через Eclipse как проект Maven, с persistence.xml
, хранящимся в src\main\resources\META_INF\persistence.xml
. Никаких других банок не упоминается.
Когда я звоню Persistence.createEntityManagerFactory
Я получаю следующее исключение. Кажется, что Child
не является сущностью!
Exception in thread "main" Local Exception Stack:
Exception [EclipseLink-30005] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.PersistenceUnitLoadingException
Exception Description: An exception was thrown while searching for persistence archives with ClassLoader: [email protected]
Internal Exception: javax.persistence.PersistenceException: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Predeployment of PersistenceUnit [Parent] failed.
Internal Exception: Exception [EclipseLink-7250] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.ValidationException
Exception Description: [class com.test.Parent] uses a non-entity [class com.test.Child] as target entity in the relationship attribute [field children].
at org.eclipse.persistence.exceptions.PersistenceUnitLoadingException.exceptionSearchingForPersistenceResources(PersistenceUnitLoadingException.java:127)
at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactoryImpl(PersistenceProvider.java:107)
at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvider.java:177)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79)
at com.test.Main.main(Main.java:22)
Caused by: javax.persistence.PersistenceException: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Predeployment of PersistenceUnit [Parent] failed.
Internal Exception: Exception [EclipseLink-7250] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.ValidationException
Exception Description: [class com.test.Parent] uses a non-entity [class com.test.Child] as target entity in the relationship attribute [field children].
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.createPredeployFailedPersistenceException(EntityManagerSetupImpl.java:1950)
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:1941)
at org.eclipse.persistence.internal.jpa.deployment.JPAInitializer.callPredeploy(JPAInitializer.java:98)
at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactoryImpl(PersistenceProvider.java:96)
... 3 more
Caused by: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Predeployment of PersistenceUnit [Parent] failed.
Internal Exception: Exception [EclipseLink-7250] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.ValidationException
Exception Description: [class com.test.Parent] uses a non-entity [class com.test.Child] as target entity in the relationship attribute [field children].
at org.eclipse.persistence.exceptions.EntityManagerSetupException.predeployFailed(EntityManagerSetupException.java:230)
... 7 more
Caused by: Exception [EclipseLink-7250] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.ValidationException
Exception Description: [class com.test.Parent] uses a non-entity [class com.test.Child] as target entity in the relationship attribute [field children].
at org.eclipse.persistence.exceptions.ValidationException.nonEntityTargetInRelationship(ValidationException.java:1378)
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.RelationshipAccessor.getReferenceDescriptor(RelationshipAccessor.java:568)
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.RelationshipAccessor.processJoinTable(RelationshipAccessor.java:725)
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.OneToManyAccessor.processManyToManyMapping(OneToManyAccessor.java:198)
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.OneToManyAccessor.process(OneToManyAccessor.java:147)
at org.eclipse.persistence.internal.jpa.metadata.MetadataProject.processOwningRelationshipAccessors(MetadataProject.java:1578)
at org.eclipse.persistence.internal.jpa.metadata.MetadataProject.processStage3(MetadataProject.java:1831)
at org.eclipse.persistence.internal.jpa.metadata.MetadataProcessor.processORMMetadata(MetadataProcessor.java:580)
at org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processORMetadata(PersistenceUnitProcessor.java:585)
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:1865)
... 5 more
Я пробовал так много вещей вокруг этого, и я действительно не знаю, что попробовать дальше. Я предполагаю, что я делаю что-то ужасно неправильно, но google наконец-то убедился. Любая помощь очень ценится :)
Все необходимые файлы для воспроизведения ниже:
Родитель:
package com.test;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
@Entity
public class Parent {
@Id
private String id;
@OneToMany
private List<Child> children;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public List<Child> getChildren() {
return children;
}
public void setChildren(List<Child> children) {
this.children = children;
}
}
Ребенок:
package com.test;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Child {
@Id
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
persistence.xml:
<persistence version="1.0"
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.
<persistence-unit name="Parent">
<class>com.test.Parent</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="eclipselink.jdbc.read-connections.min" value="1" />
<property name="eclipselink.jdbc.write-connections.min" value="1" />
<property name="eclipselink.jdbc.batch-writing" value="JDBC" />
<property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>
<property name="eclipselink.ddl-generation.output-mode" value="database"/>
<!-- Logging -->
<property name="eclipselink.logging.level" value="INFO" />
<property name="eclipselink.logging.timestamp" value="true" />
<property name="eclipselink.logging.session" value="true" />
<property name="eclipselink.logging.thread" value="false" />
</properties>
</persistence-unit>
<persistence-unit name="Child">
<class>com.test.Child</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="eclipselink.jdbc.read-connections.min" value="1" />
<property name="eclipselink.jdbc.write-connections.min" value="1" />
<property name="eclipselink.jdbc.batch-writing" value="JDBC" />
<property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>
<property name="eclipselink.ddl-generation.output-mode" value="database"/>
<!-- Logging -->
<property name="eclipselink.logging.level" value="INFO" />
<property name="eclipselink.logging.timestamp" value="true" />
<property name="eclipselink.logging.session" value="true" />
<property name="eclipselink.logging.thread" value="false" />
</properties>
</persistence-unit>
</persistence>
Основной класс (Для тестирования):
package com.test;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.Persistence;
public class Main {
private static final String KEY_PERSISTENCE_URL = "javax.persistence.jdbc.url";
private static final String KEY_PERSISTENCE_USER = "javax.persistence.jdbc.user";
private static final String KEY_PERSISTENCE_PASS = "javax.persistence.jdbc.password";
public static void main(String[] args) {
Map<String, String> properties = new HashMap<>();
properties.put(KEY_PERSISTENCE_URL, "jdbc:mysql://localhost:3306/reporting");
properties.put(KEY_PERSISTENCE_USER, "root");
properties.put(KEY_PERSISTENCE_PASS, "p4ssw0rd");
Persistence.createEntityManagerFactory(Parent.class.getSimpleName(), properties);
}
}
Я понятия не имел, что несколько классов должны содержаться в одной и той же единице персистентности, поэтому это выглядит так, как будто я пропускаю (придется ждать до завтра, чтобы проверить , может быть неправильным). Если объекты «Child» содержались в объектах «Parent» и «School» (например), мог ли класс присутствовать в двух отдельных единицах сохранения? (предполагая, что я хотел бы, чтобы в первую очередь были выделены две отдельные «родительские» и «школьные»). –
Ваша сущность может быть как можно больше единиц сохранения. Это просто класс java. Единицей сохранения является механизм хранения. Я не понимаю, почему у вас родитель и школа были бы отделены, если бы у вас их не было в разных базах данных, и оба экземпляра базы данных имели собственное дочернее представление, позволяющее повторно использовать дочерний класс. – Chris
Это сработало - я знал, что мне не хватает чего-то фундаментального, так что спасибо. –