2016-05-17 3 views
1

私はEclipseLinkを使用しています。私は非常に奇妙な結果を得ています。 、次のコードを考えてみてください:JPA:fiedとgetterの@Idの設定との違い

このコードは動作します:

@Entity 
@Table(name = "someTable") 
public class SomeClass{ 
    @Id// PAY ATTENTION TO THIS LINE 
    private String id; 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    @Column (name = "somecol")// PAY ATTENTION TO THIS LINE 
    private String name; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

このコードも動作します:

@Entity 
@Table(name = "someTable") 
public class SomeClass{ 
    @Id// PAY ATTENTION TO THIS LINE 
    private String id; 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    //@Column (name = "somecol")// PAY ATTENTION TO THIS LINE 
    private String name; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

このコードも動作します:

@Entity 
@Table(name = "someTable") 
public class SomeClass{ 

    private String id; 

    @Id// PAY ATTENTION TO THIS LINE 
    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    //@Column (name = "somecol")// PAY ATTENTION TO THIS LINE 
    private String name; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

このコードはdoesnの」 T仕事:

@Entity 
@Table(name = "someTable") 
public class SomeClass{ 

    private String id; 

    @Id // PAY ATTENTION TO THIS LINE 
    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    @Column (name = "somecol")// PAY ATTENTION TO THIS LINE 
    private String name; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

私は次の例外を取得:

Exception Description: Entity class [class SomeClass] has no primary key specified. It should define either an @Id, @EmbeddedId or an @IdClass. If you have defined PK using any of these annotations then make sure that you do not have mixed access-type (both fields and properties annotated) in your entity class hierarchy. 
    at org.eclipse.persistence.exceptions.ValidationException.noPrimaryKeyAnnotationsFound(ValidationException.java:1425) 
    at org.eclipse.persistence.internal.jpa.metadata.accessors.classes.EntityAccessor.validatePrimaryKey(EntityAccessor.java:1542) 
    at org.eclipse.persistence.internal.jpa.metadata.accessors.classes.EntityAccessor.processMappingAccessors(EntityAccessor.java:1249) 
    at org.eclipse.persistence.internal.jpa.metadata.accessors.classes.EntityAccessor.process(EntityAccessor.java:699) 
    at org.eclipse.persistence.internal.jpa.metadata.MetadataProject.processStage2(MetadataProject.java:1808) 
    at org.eclipse.persistence.internal.jpa.metadata.MetadataProcessor.processORMMetadata(MetadataProcessor.java:573) 
    at org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processORMetadata(PersistenceUnitProcessor.java:607) 
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:1948) 
    at org.eclipse.persistence.internal.jpa.deployment.JPAInitializer.callPredeploy(JPAInitializer.java:100) 
    at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactoryImpl(PersistenceProvider.java:104) 
    at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvider.java:188) 
    at org.eclipse.gemini.jpa.ProviderWrapper.createEntityManagerFactory(ProviderWrapper.java:128) 
    at org.eclipse.gemini.jpa.proxy.EMFServiceProxyHandler.createEMF(EMFServiceProxyHandler.java:151) 
    at org.eclipse.gemini.jpa.proxy.EMFServiceProxyHandler.syncGetEMFAndSetIfAbsent(EMFServiceProxyHandler.java:127) 
    at org.eclipse.gemini.jpa.proxy.EMFServiceProxyHandler.invoke(EMFServiceProxyHandler.java:73) 
    at com.sun.proxy.$Proxy8.createEntityManager(Unknown Source) 

は、なぜ最後のコードの作品はないのでしょうか?それを説明する方法?

答えて

3

複合モードを使用する場合は、エンティティとフィールドレベルで指定する必要がある@Accessなどがあるためです。 AccessType.PROPERTYAccesType.FIELDの2つの値があります。

デフォルトのアクセスタイプは、識別子の注釈(@Id)を置く場所で定義されます。フィールド上に置くと、AccessType.FIELDになります。ゲッターに置くと、AccessType.PROPERTYになります。 - 編集済み、JPAで定義されていません。

フィールドには注釈を付けるが、フィールドには@Idを持つプロパティをアノテートする場合は、ゲッターを定義し、AccessType.PROPERTYと注釈を付ける必要があります。 (またはゲッターの@Idの場合はその逆)。

+0

私は混乱しています: '@ Id'の場所に' AccessType'を置くと、なぜ "プライマリキーが指定されていません"と不平を言うのですか?あなたの答えに基づいて、最後の例は 'AccessType.PROPERTY'にデフォルト設定され、' @ Id'アノテーションは正しい場所に置かれていますか? –

+0

もう一度検索すると、この回答が得られます。http://stackoverflow.com/a/13874900/395202あなたの言ったことは**回答**と同じですが、**コメント**のセクションで判明しました。その答え( '@ Id'は' AccessType'を決定する)がJPA標準ではないことを示唆しています。 (そして、OPが直面している動作についても説明していません) –

+0

投稿した内容を読みました。正直なところ、私はAccessTypeについて覚えています。なぜなら、私はJPAのトレーニングでそれについて練習しているからです(しかし私はHibernateをプロバイダとして使用します)。私が今理解していることは、EclipseLinkがそれを別々に扱うことです。それにもかかわらず、あなたは正しいです。私の答えは実際の質問には答えられませんでした。なぜPK-exceptionがないのですか?しかし、確かに症状を避けるために役立ちました。 – gmaslowski

関連する問題