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

时间:2012-08-27 01:07:48

标签: 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;
    }
}

第一个实体:

@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提供者。

5 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:7)

如果在FinanceEntityBean的其他Eclipse项目中定义Tag,则可能会遇到Dali错误"No primary key attribute in other plug-in project"

解决方法是在与FinanceEntityBean相关联的persistence.xml文件中列出Tag

答案 2 :(得分: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) { ... }
}

答案 3 :(得分:2)

我有同样的问题,但出于不同的原因,但我没有意识到。在进一步的研究中,我发现在我的情况下,我将MappedSuperclass放在一个不同的jar中。根据用户气体this

“根据JPA规范,如果你在单独的jar中有jpa类,你应该将它添加到persistence.xml(我不知道,如果Hibernate要求,但你可以尝试一下)。尝试添加在输入你的persistence.xml entity.jar之后“

他引用https://stackoverflow.com/users/3701228/gas作为如何执行此操作的说明。

答案 4 :(得分:1)

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

最简单的“纠正”方法是根据您的环境设置偏好。我喜欢“警告”,因为在实体没有主键的情况下会出现错误情况。

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