5

JPAは初めてで、EclipseLinkから始めています。チュートリアルの助けを借りて、最も基本的な選択クエリを起動する単純なメイン クラスであるエンティティ (JPA ツールを使用して自動的に作成されたもの) で構成される最初の JPA プロジェクトの作成を開始しました。ただし、メイン クラスを実行しようとすると、PersistenceUnit の Predeployment failed 例外が発生します。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
4

2 に答える 2

3

Part of the learning process is being used to reading stack traces. The line you need is:

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.

What does your Employee class look like?

EDIT

as Chris has noted your attributes are not Serializable. Make your dates into java.util.Date, java.util.Calendar or java.sql.Date. The first 2 require an @Temporal annotation with a TemporalType. Each of these would allow your example to run, but you should be aware of the differences in what will get stored.

You should also change your other attributes to Serializable types such as String for jobTitle.

hope this helps

于 2013-09-22T14:17:35.380 に答える