@Entity无法识别@MappedSuperclass中的@Id

Gor*_*don 12 java eclipse hibernate jpa jpa-2.0

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

我的基类:

@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

第一个实体:

@Entity
@Table(name = "tag")
public class Tag extends FinanceEntityBean {
}
Run Code Online (Sandbox Code Playgroud)

我已经使用此代码编写测试来在Tag实体上执行CRUD功能,并且它们都正常工作.

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

The entity has no primary key attribute defined

我已将此更改为警告,因此我的代码将编译,但我很好奇为什么Eclipse不满意,如果我误解了某些内容.

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

Kar*_*zke 8

使用混合访问时,您必须指定访问类型.请参阅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;
    }
}
Run Code Online (Sandbox Code Playgroud)


Bri*_*rgh 7

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

解决方法是列出与之关联FinanceEntityBeanpersistence.xml文件Tag.