Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA:在fied和getter上设置@Id的区别_Java_Jpa_Eclipselink - Fatal编程技术网

Java JPA:在fied和getter上设置@Id的区别

Java JPA:在fied和getter上设置@Id的区别,java,jpa,eclipselink,Java,Jpa,Eclipselink,我使用日食,我得到了非常奇怪的结果。请考虑下面的代码: 此代码适用于: @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) {

我使用日食,我得到了非常奇怪的结果。请考虑下面的代码:

此代码适用于:

@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;
    }
}
此代码也适用于:

@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;
    }
}
此代码不起作用:

@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)

为什么最后的代码不起作用?如何解释?

这是因为如果要使用混合模式,必须在实体和字段级别指定类似于
@Access
的内容。有两个值
AccessType.PROPERTY
AccessType.FIELD

默认访问类型由您放置标识符注释的位置定义(
@Id
)。如果您将它放在字段上-它将是
AccessType.field
,如果您将它放在getter上-它将是
AccessType.PROPERTY
-已编辑,未由JPA定义


如果您不想注释字段而是属性(字段上仍有@Id),则必须定义一个getter并将其注释为
AccessType.PROPERTY
。(对于getter上的
@Id
,反之亦然)。

我感到困惑:如果放置
@Id
的位置决定了
访问类型,为什么它会抱怨“没有指定主键”?根据您的答案,最后一个示例将默认为
AccessType.PROPERTY
,并且
@Id
注释放在了正确的位置,不是吗?只需进一步搜索,就可以得到以下答案:您所说的与答案相同,但结果是,在答案的注释部分,提示了此类行为(
@Id
决定
AccessType
)不是JPA标准。(它也不能解释OP面临的行为)我刚刚读了你发布的内容。老实说,我记得关于AccessType的这一点,只是因为我在JPA培训中有一个关于它的练习(但我使用Hibernate作为提供者).我现在理解的是EclipseLink的处理方式不同。不过,你是对的。我的回答没有回答实际问题,这就是为什么没有PK例外:)。但肯定有助于避免这些症状。我想JPA的标准坚持访问类型在整个类中都必须是标准的(即使在我相信的整个层次结构中也是如此)。供应商可自行决定如何处理不一致的情况。答案不错,因为它为其他人(包括我)找到更多问题提供了正确的方向:)