2013-10-03 2 views
4

У меня очень простой случай с ссылкой 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); 
    } 
} 

ответ

5

Блока живучести используется только содержит единое целое, и поэтому не имеет сведений о том, как сохранить свой ссылаются дочерний класс не-сущности. Ребенок - это объект в другой группе персистентности, но это только объект Java для родительского PU. Два блока должны быть объединены в один, который включает все зависимые объекты.

+0

Я понятия не имел, что несколько классов должны содержаться в одной и той же единице персистентности, поэтому это выглядит так, как будто я пропускаю (придется ждать до завтра, чтобы проверить , может быть неправильным). Если объекты «Child» содержались в объектах «Parent» и «School» (например), мог ли класс присутствовать в двух отдельных единицах сохранения? (предполагая, что я хотел бы, чтобы в первую очередь были выделены две отдельные «родительские» и «школьные»). –

+0

Ваша сущность может быть как можно больше единиц сохранения. Это просто класс java. Единицей сохранения является механизм хранения. Я не понимаю, почему у вас родитель и школа были бы отделены, если бы у вас их не было в разных базах данных, и оба экземпляра базы данных имели собственное дочернее представление, позволяющее повторно использовать дочерний класс. – Chris

+0

Это сработало - я знал, что мне не хватает чего-то фундаментального, так что спасибо. –

Смежные вопросы