我正在尝试为一组实体创建基类,以减少编码工作和重复。我的想法是基类具有公共元数据字段,子类处理它们的唯一属性。
我的基类:
@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提供者。
答案 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 错误/警告 类型 实体没有主键:[错误|警告|信息|忽略]