2013-09-22 2 views
5

Sono nuovo di JPA e inizio con EclipseLink. Prendendo aiuto dal tutorial ho iniziato a creare il mio primo progetto JPA che consta di un'entità (creata automaticamente utilizzando gli strumenti JPA), una semplice classe principale che attiva la query di selezione più semplice. Tuttavia quando provo a eseguire la classe principale ottengo un'eccezione di Preistenza persistenza non riuscita. Sto usando SQL server Express 2008 e interrogando il database AdventureWorks di esempio. Sono in grado di connettermi al database (usando Database Development Perspective). Dettagliato log degli errori e frammenti di codice qui sotto:Predeployment of PersistenceUnit non riuscito con EclipseLink

Classe principale

import java.util.List; 
    import javax.persistence.EntityManager; 
    import javax.persistence.Persistence; 
    import model.Employee; 

    public class Main { 
    public static void main(String[] args) { 
EntityManager em = Persistence.createEntityManagerFactory("JPA2").createEntityManager(); 
    List<Employee> list = em.createQuery("Select * from humanresources.Employee", Employee.class).getResultList(); 
    for(Employee e : list) 
    { 
     System.out.println(e.getBirthDate()); 
    } 
} 
} 

Entity

  package model; 

     import java.io.Serializable; 
     import javax.persistence.*; 
     import java.sql.Timestamp; 

     @Entity 
     public class Employee implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
     @Column(name="BusinessEntityID") 
    private int businessEntityID; 

    @Column(name="BirthDate") 
    private Object birthDate; 

    @Column(name="Gender") 
    private Object gender; 

    @Column(name="HireDate") 
    private Object hireDate; 

    @Column(name="JobTitle") 
    private Object jobTitle; 

    @Column(name="MaritalStatus"); 
    private Object maritalStatus; 

@Column(name="ModifiedDate") 
private Timestamp modifiedDate; 

@Column(name="NationalIDNumber") 
private Object nationalIDNumber; 

@Column(name="OrganizationLevel") 
private short organizationLevel; 

@Column(name="OrganizationNode") 
private String organizationNode; 

private String rowguid; 

@Column(name="SickLeaveHours") 
private short sickLeaveHours; 

@Column(name="VacationHours") 
private short vacationHours; 

public Employee() { 
} 

public int getBusinessEntityID() { 
    return this.businessEntityID; 
} 

public void setBusinessEntityID(int businessEntityID) { 
    this.businessEntityID = businessEntityID; 
} 

public Object getBirthDate() { 
    return this.birthDate; 
} 

public void setBirthDate(Object birthDate) { 
    this.birthDate = birthDate; 
} 

public Object getGender() { 
    return this.gender; 
} 

public void setGender(Object gender) { 
    this.gender = gender; 
} 

public Object getHireDate() { 
    return this.hireDate; 
} 

public void setHireDate(Object hireDate) { 
    this.hireDate = hireDate; 
} 

public Object getJobTitle() { 
    return this.jobTitle; 
} 

public void setJobTitle(Object jobTitle) { 
    this.jobTitle = jobTitle; 
} 


public Object getMaritalStatus() { 
    return this.maritalStatus; 
} 

public void setMaritalStatus(Object maritalStatus) { 
    this.maritalStatus = maritalStatus; 
} 

public Timestamp getModifiedDate() { 
    return this.modifiedDate; 
} 

public void setModifiedDate(Timestamp modifiedDate) { 
    this.modifiedDate = modifiedDate; 
} 

public Object getNationalIDNumber() { 
    return this.nationalIDNumber; 
} 

public void setNationalIDNumber(Object nationalIDNumber) { 
    this.nationalIDNumber = nationalIDNumber; 
} 

public short getOrganizationLevel() { 
    return this.organizationLevel; 
} 

public void setOrganizationLevel(short organizationLevel) { 
    this.organizationLevel = organizationLevel; 
} 

public String getOrganizationNode() { 
    return this.organizationNode; 
} 

public void setOrganizationNode(String organizationNode) { 
    this.organizationNode = organizationNode; 
} 

public String getRowguid() { 
    return this.rowguid; 
} 

public void setRowguid(String rowguid) { 
    this.rowguid = rowguid; 
} 

public short getSickLeaveHours() { 
    return this.sickLeaveHours; 
} 

public void setSickLeaveHours(short sickLeaveHours) { 
    this.sickLeaveHours = sickLeaveHours; 
} 

public short getVacationHours() { 
    return this.vacationHours; 
} 

public void setVacationHours(short vacationHours) { 
    this.vacationHours = vacationHours; 
} 

} 

persistence.xml (sotto la cartella META-INF)

 <?xml version="1.0" encoding="UTF-8"?> 
     <persistence version="2.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_2_0.xsd"> 
<persistence-unit name="JPA2" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
    <class>model.Employee</class> 
    <properties> 
     <property name="eclipselink.target-database" value="SQLServer"/> 
     <property name="javax.persistence.jdbc.url" value="jdbc:sqlserver://localhost:1433;databaseName=AdventureWorks2008"/> 
     <property name="javax.persistence.jdbc.user" value="Username"/> 
     <property name="javax.persistence.jdbc.password" value="Username"/> 
     <property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/> 
    </properties> 
</persistence-unit> 

Eccezione

Exception in thread "main" Local Exception Stack: 
      Exception [EclipseLink-30005] (Eclipse Persistence Services - 2.4.2.v20130514-     5956486): 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.4.2.v20130514-5956486):   org.eclipse.persistence.exceptions.EntityManagerSetupException 
      Exception Description: Predeployment of PersistenceUnit [JPA2] failed. 
      Internal Exception: Exception [EclipseLink-7155] (Eclipse Persistence Services - 2.4.2.v20130514-5956486): org.eclipse.persistence.exceptions.ValidationException 
      Exception Description: The type [class java.lang.Object] for the attribute [hireDate] on the entity class [class model.Employee] is not a valid type for a serialized mapping. The attribute type must implement the Serializable interface. 
      at org.eclipse.persistence.exceptions.PersistenceUnitLoadingException.exceptionSearchingForPer sistenceResources(PersistenceUnitLoadingException.java:127) 
      at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvi der.java:118) 
      at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:78) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54) 
    at Main.main(Main.java:20) 
      Caused by: javax.persistence.PersistenceException: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.4.2.v20130514-5956486): org.eclipse.persistence.exceptions.EntityManagerSetupException 
      Exception Description: Predeployment of PersistenceUnit [JPA2] failed. 
      Internal Exception: Exception [EclipseLink-7155] (Eclipse Persistence Services - 2.4.2.v20130514-5956486): org.eclipse.persistence.exceptions.ValidationException 
      Exception Description: The type [class java.lang.Object] for the attribute [hireDate] on the entity class [class model.Employee] is not a valid type for a serialized mapping. The attribute type must implement the Serializable interface. 
      at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.createPredeployFailedPersistenc eException(EntityManagerSetupImpl.java:1556) 
      at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImp l.java:1547) 
      at org.eclipse.persistence.internal.jpa.deployment.JPAInitializer.callPredeploy(JPAInitializer .java:98) 
      at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvi der.java:108) 
    ... 3 more 
      Caused by: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.4.2.v20130514-5956486): org.eclipse.persistence.exceptions.EntityManagerSetupException 
      Exception Description: Predeployment of PersistenceUnit [JPA2] failed. 
      Internal Exception: Exception [EclipseLink-7155] (Eclipse Persistence Services -    2.4.2.v20130514-5956486): org.eclipse.persistence.exceptions.ValidationException 
      Exception Description: The type [class java.lang.Object] for the attribute [hireDate] on the entity class [class model.Employee] is not a valid type for a serialized mapping. The attribute type must implement the Serializable interface. 
      at org.eclipse.persistence.exceptions.EntityManagerSetupException.predeployFailed(EntityManage rSetupException.java:221) 
       ... 7 more 
      Caused by: Exception [EclipseLink-7155] (Eclipse Persistence Services - 2.4.2.v20130514-5956486): org.eclipse.persistence.exceptions.ValidationException 
      Exception Description: The type [class java.lang.Object] for the attribute [hireDate] on the entity class [class model.Employee] is not a valid type for a serialized mapping. The attribute type must implement the Serializable interface. 
      at org.eclipse.persistence.exceptions.ValidationException.invalidTypeForSerializedAttribute(ValidationException.java:1121) 
    at org.eclipse.persistence.internal.jpa.metadata.converters.SerializedMetadata.process(SerializedMetadata.java:99) 
    at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.MappingAccessor.processSerialized(MappingAccessor.java:1807) 
    at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.MappingAccessor.processJPA Converters(MappingAccessor.java:1586) 
    at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.MappingAccessor.processMappingConverter(MappingAccessor.java:1652) 
    at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.MappingAccessor.processMap pingValueConverter(MappingAccessor.java:1670) 
    at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.BasicAccessor.process(BasicAccessor.java:414) 
    at org.eclipse.persistence.internal.jpa.metadata.MetadataDescriptor.processMappingAccessors(MetadataDescriptor.java:1461) 
    at org.eclipse.persistence.internal.jpa.metadata.accessors.classes.ClassAccessor.processMappingAccessors(ClassAccessor.java:1526) 
    at org.eclipse.persistence.internal.jpa.metadata.accessors.classes.EntityAccessor.processMappingAccessors(EntityAccessor.java:1085) 
    at org.eclipse.persistence.internal.jpa.metadata.accessors.classes.EntityAccessor.process(EntityAccessor.java:645) 
    at org.eclipse.persistence.internal.jpa.metadata.MetadataProject.processStage2(MetadataProject.java:1718) 
    at org.eclipse.persistence.internal.jpa.metadata.MetadataProcessor.processORMMetadata(MetadataProcessor.java:536) 
    at org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processORMetadata(PersistenceUnitProcessor.java:550) 
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:1484) 
    ... 5 more 

risposta

3

parte del processo di apprendimento viene utilizzato per la lettura di tracce dello stack. La linea che vi serve è:

Exception Description: The type [class java.lang.Object] for the attribute [hireDate] on the entity class [class model.Employee] is not a valid type for a serialized mapping. The attribute type must implement the Serializable interface. 

cosa fa la classe Employee assomigliare?

EDIT

come ha notato Chris tuoi attributi non sono Serializable. Imposta le date in java.util.Date, java.util.Calendar o java.sql.Date. I primi 2 richiedono un'annotazione @Temporal con un TemporalType. Ognuno di questi consentirebbe l'esecuzione del tuo esempio, ma dovresti essere consapevole delle differenze tra ciò che verrà memorizzato.

È inoltre necessario modificare gli altri attributi in tipi Serializable come String per jobTitle.

speranza che questo aiuta

+0

Come accennato, la classe Entity è stata generata automaticamente utilizzando JPA e quindi implementa Serializable per impostazione predefinita. Inoltre ho provato a rimuovere la classe Entity su una singola proprietà int, ma ancora senza fortuna. Ho aggiunto dettagli per la classe Entity anche nella domanda sopra – Ruschel

+0

Tutti i tipi di attributi all'interno del dipendente sono di tipo Object che non è serializzabile e non è probabile ciò che si desidera. Hiredate menzionato nell'errore per esempio sembra invece dovrebbe essere un java.sql.Date – Chris

2

Hai mai ottenere risolto questo?

Ho notato che nella classe di entità, l'entità Employee si trova in un pacchetto chiamato model (il pacchetto predefinito creato dall'IDE) mentre nel persence.xml e nel metodo main - lo si ha in un pacchetto humanresource.