使用EclipseLink预先部署PersistenceUnit失败

时间:2013-09-22 13:29:07

标签: java jpa eclipselink

是JPA的新手,从EclipseLink开始。从教程中获取帮助,我开始创建我的第一个JPA项目,该项目包含一个实体(使用JPA工具自动创建),这是一个触发最基本选择查询的简单主类。但是,当我尝试运行主类时,我得到一个PersistenceUnit预部署失败的异常。我使用SQL Server express 2008并查询示例AdventureWorks数据库。能够连接到数据库(使用Database Development Perspective)。详细的错误日志和代码片段如下:

主要课程

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

实体

         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: sun.misc.Launcher$AppClassLoader@1ac04e8
           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

2 个答案:

答案 0 :(得分: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课程是什么样的?

修改

Chris已经注意到你的属性不是Serializable。将您的日期设置为java.util.Date,java.util.Calendar或java.sql.Date。前2个需要带有TemporalType的@Temporal注释。其中每个都允许您的示例运行,但您应该知道将存储的内容的差异。

您还应该将其他属性更改为Serializable类型,例如jobTitle的String。

希望这会有所帮助

答案 1 :(得分:2)

你有没有对它进行排序?

我注意到在你的实体类中,你的Employee实体位于一个名为model的包中(由IDE创建的默认包),而在你的persistence.xml和main方法中 - 你将它放在一个humanresource包中。