@Entity不识别@MappedSuperclass中的@Id

2022-09-03 06:15:10

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

我的基类:

@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 {
}

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

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

The entity has no primary key attribute defined

我现在把它改成了警告,所以我的代码可以编译,但我很好奇为什么Eclipse不高兴,以及我是否误解了什么。

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


答案 1

使用混合访问时,必须指定访问类型。请参阅 Eclipse Dali bug 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;
    }
}

答案 2

如果在 与 不同的 Eclipse 项目中定义,则可能遭受 Dali 错误“其他插件项目中没有主键属性”。FinanceEntityBeanTag

解决方法是在与 关联的文件中列出。FinanceEntityBeanpersistence.xmlTag


推荐