2013-09-22 3 views
5

Является новым для JPA и начинается с EclipseLink. Приняв помощь из учебника, я начал создавать свой первый проект JPA, посвященный Entity (автоматически созданный с использованием инструментов JPA), простой основной класс, запускающий самый базовый запрос выбора. Однако, когда я пытаюсь запустить основной класс, я получаю исключение с предварительным развертыванием PersistenceUnit. Я использую SQL Server express 2008 и запрашиваю образец базы данных AdventureWorks. Возможность подключения к базе данных (с использованием перспективы развития базы данных). Подробный журнал ошибок и фрагменты кода ниже:Предварительная подготовка PersistenceUnit не удалась с EclipseLink

Главный класс

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 (в папке 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> 

Исключение

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 

ответ

3

Часть процесса обучения используется для чтения трассировки стека. Линия вам нужно:

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. 

Что делает ваш Employee класс выглядеть?

EDIT

как отметил Крис ваши атрибуты не Сериализуемый. Сделайте свои даты в java.util.Date, java.util.Calendar или java.sql.Date. Первые 2 требуют аннотации @Temporal с TemporalType. Каждый из них позволит вашему примеру работать, но вы должны знать о различиях в том, что будет храниться.

Вы также должны изменить другие атрибуты на Serializable типы, такие как String для jobTitle.

надеюсь, что это помогает

+0

Как я уже говорил, класс Entity был автоматически сгенерирован с использованием JPA и, следовательно, реализует Serializable по умолчанию. Более того, я попытался разделить класс Entity на одно свойство int, но все равно не повезло. Я добавил детали для класса Entity также в вопросе выше – Ruschel

+0

Все ваши типы атрибутов внутри сотрудника имеют тип Object, который не является сериализуемым, и вряд ли что вы хотите. Hiredate, упомянутый в ошибке, например, кажется, что это должен быть java.sql.Date вместо этого – Chris

2

ли вы когда-нибудь это отсортирован?

Я заметил, что в классе сущности ваш объект Employee находится в пакете под названием model (пакет по умолчанию, созданный средой IDE), тогда как в вашем persistence.xml и основном методе - вы имеете его в пакете humanresource.

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