16

我正在尝试为一组实体创建一个基类,以减少编码工作和重复。我的想法是基类具有公共元数据字段,子类处理它们的独特属性。

我的基类:

@MappedSuperclass
public abstract class FinanceEntityBean {
    protected Long id;

    @Version
    private long version;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }

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

第一个实体:

@Entity
@Table(name = "tag")
public class Tag extends FinanceEntityBean {
}

我已经使用此代码编写了测试,以在 Tag 实体上执行 CRUD 函数,并且它们都工作正常。

我的问题是 - 为什么 Eclipse (Indigo) 坚持认为Tag有错误:

The entity has no primary key attribute defined

我现在已将其更改为警告,以便我的代码可以编译,但我很好奇 Eclipse 为什么不高兴,以及我是否误解了某些东西。

这是有效的 JPA 2.0 代码吗?Hibernate 4.1.5 是我的 JPA 提供者。

4

5 回答 5

9

使用混合访问时,您必须指定访问类型。请参阅 Eclipse Dali错误 323527,以在对字段和属性进行注释时提供更好的验证错误。

选项 1:改为注释 getVersion() 方法,仅注释属性。
选项 2:指定混合访问类型,如下所示:

@MappedSuperclass
@Access(AccessType.PROPERTY)
public abstract class FinanceEntityBean {
    protected Long id;

    @Version
    @Access(AccessType.FIELD)
    private long version;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }

    public void setId(final Long id) {
        this.id = id;
    }
}
于 2012-08-29T17:35:57.857 回答
7

如果FinanceEntityBean在不同的 Eclipse 项目中定义Tag,您可能会遇到 Dali 错误 “其他插件项目中没有主键属性”

解决方法是FinanceEntityBeanpersistence.xml文件中列出与Tag.

于 2012-08-27T21:56:59.630 回答
3

我相当肯定这些是有效的映射。

JPA 2.0 规范在讨论 MappedSuperClasses 时提供了这个示例(第 2.11.2 节):

@MappedSuperclass 
public class Employee {
    @Id protected Integer empId; 
    @Version protected Integer version; 
    @ManyToOne @JoinColumn(name="ADDR") protected Address address;
    public Integer getEmpId() { ... } 
    public void setEmpId(Integer id) { ... } 
    public Address getAddress() { ... } 
    public void setAddress(Address addr) { ... }
}

// Default table is FTEMPLOYEE table 
@Entity public class FTEmployee extends Employee {
    // Inherited empId field mapped to FTEMPLOYEE.EMPID 
    // Inherited version field mapped to FTEMPLOYEE.VERSION 
    // Inherited address field mapped to FTEMPLOYEE.ADDR fk
    // Defaults to FTEMPLOYEE.SALARY protected Integer salary;
    public FTEmployee() {}
    public Integer getSalary() { ... } 
    public void setSalary(Integer salary) { ... }
}
于 2012-08-27T01:34:39.627 回答
2

我有同样的问题,但出于不同的原因,但我没有意识到。在进一步的研究中,我发现在我的情况下,我将 MappedSuperclass 放在不同的 jar 中。根据用户气体https://stackoverflow.com/users/3701228/gas

“根据 JPA 规范,如果您在单独的 jar 中有 jpa 类,则应将其添加到 persistence.xml(我不知道,如果 Hibernate 需要,但您可以尝试一下)。尝试将以下条目添加到你的 persistence.xml entity.jar”

他引用了在 web 应用程序中引用 jpa persistence.xml 中的 jar 文件的正确路径是什么?作为如何做到这一点的描述。

于 2016-06-28T19:02:48.900 回答
1

我知道这已经晚了,但这仍然是一个问题。感谢@Kemoda 在对问题的评论中指出,这可以在 Eclipse 首选项中关闭。

“纠正”此问题的最简单方法是按照您认为适合您的环境的方式设置首选项。我喜欢“警告”,因为在实体没有主键的情况下是错误情况。

JPA 错误/警告类型实体没有主键:[错误|警告|信息|忽略]

于 2020-01-31T21:46:35.703 回答