2013-09-22 16 views
5

Jestem nowy w JPA i zaczynam od EclipseLink. Korzystając z samouczka, zacząłem tworzyć mój pierwszy projekt JPA, składający się z Entity (automatycznie tworzonego przy użyciu narzędzi JPA), prostej głównej klasy, która uruchamia najbardziej podstawowe zapytanie. Jednak, gdy próbuję uruchomić główną klasę, otrzymuję Predeployment of PersistenceUnit failed exception. Używam SQL Server Express 2008 i szukam przykładowej bazy danych AdventureWorks. Jestem w stanie połączyć się z bazą danych (przy użyciu Perspektywy Rozwoju Bazy Danych). Szczegółowy dziennik błędów i fragmentów kodu poniżej:Predeployment of PersistenceUnit failed with EclipseLink

głównego klasy

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()); 
    } 
} 
} 

Podmiot

  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 (w folderze 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> 

Wyjątek

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 

Odpowiedz

3

część procesu uczenia się jest używany do czytania ślady stosu. Linia czego potrzebujesz to:

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. 

Co twoja klasa Employee wyglądać?

EDIT

jak zauważył Chris atrybuty nie są Serializable. Wpisz daty w java.util.Date, java.util.Calendar lub java.sql.Date. Pierwsze 2 wymagają adnotacji @Temporal za pomocą TemporalType. Każdy z nich pozwoliłby na działanie twojego przykładu, ale powinieneś zdawać sobie sprawę z różnic w tym, co zostanie zapisane.

Powinieneś także zmienić swoje inne atrybuty na Serializable, takie jak String for jobTitle.

nadzieję, że to pomaga

+0

Jak już wspomniałem, klasa Entity została wygenerowana automatycznie przy użyciu JPA i dlatego domyślnie implementuje Serializable. Co więcej, próbowałem rozebrać klasę Entity na jedną właściwość int, ale wciąż nie miałem szczęścia. Dodałem szczegóły dotyczące klasy Entity również w pytaniu powyżej – Ruschel

+0

Wszystkie typy atrybutów w obrębie pracownika są typu Object, który nie jest możliwy do serializacji, i prawdopodobnie nie jest to, co chcesz. Na przykład Hiredate wspomniany w błędzie wygląda na to, że powinien to być plik java.sql.Date – Chris

2

Czy kiedykolwiek się to sortowane?

Zauważyłem, że w twojej klasie encji twój pracownik jest w pakiecie nazywanym modelem (pakiet domyślny stworzony przez IDE), podczas gdy w twoim persistence.xml i głównej metodzie - masz go w pakiecie z zasobami ludzkimi.