2013-09-22 12 views
5

JPAの新機能で、EclipseLinkから始まりました。チュートリアルの助けを借りて私は、最も基本的な選択クエリを実行するシンプルなメインクラスである、エンティティ(JPAツールを使用して自動的に作成された)をコンソートする最初のJPAプロジェクトを作成し始めました。しかし、私がメインクラスを走らせようとすると、PersistenceUnitのPredeploymentが例外に失敗します。 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()); 
    } 
} 
} 

エンティティ(META-INFフォルダの下)

  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の

 <?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つはTemporalTypeの@Temporalアノテーションを必要とします。これらのそれぞれは、あなたの例を実行することができますが、保存されるものの違いを認識しておく必要があります。

また、他の属性をjobTitleのStringなどのシリアライズ可能なタイプに変更する必要があります。

これが役に立ちます

+0

私が言及したように、EntityクラスはJPAを使用して自動生成され、したがってデフォルトでSerializableを実装します。さらに、Entityクラスを単一のintプロパティにストライピングしようとしましたが、まだ運がありません。 Entityクラスの詳細を上記の質問 – Ruschel

+0

に追加しました。従業員内のすべての属性タイプは、シリアライズ可能ではなく、あなたが望むものではないObject型です。たとえば、エラーに記載されているHiredateは、代わりにjava.sql.Dateである必要があるようです – Chris

2

これはあなたがこれを選んだことがありますか?

あなたのEmployeeエンティティはmodel(IDEで作成されたデフォルトパッケージ)というパッケージに含まれていましたが、persistence.xmlとmainメソッドではヒューマンリソースパッケージに入っています。

関連する問題