Eclipse 中单独 JAR 中的 JPA @MappedSuperclass 导致验证错误“实体未定义主键属性”
Posted
技术标签:
【中文标题】Eclipse 中单独 JAR 中的 JPA @MappedSuperclass 导致验证错误“实体未定义主键属性”【英文标题】:JPA @MappedSuperclass in separate JAR in Eclipse causes validation error "The entity has no primary key attribute defined" 【发布时间】:2012-08-16 06:12:09 【问题描述】:我有一个@MappedSuperclass AbstractEntity 用于我的所有@Entity 类。只要超类与我的实体在同一个 Eclipse 项目中,它就可以完美地工作。但是由于我在几个项目中重用了这个超类,我只想将它分解成它自己的 JAR 文件。当我这样做时(当然我将 JAR 文件添加到构建路径中),Eclipse 在我的每个 @Entity 类上都会给出一个错误:
实体没有定义主键属性。
Eclipse 突出显示@Entity 注释作为错误的来源。当然,所有的类都继承自这个 AbstractEntity。两个项目中的包名称相同。 JAR 项目具有所有必要的构建路径 - 包含 AbstractEntity 的 JAR 文件项目中没有错误。
当我将它部署到我的应用服务器 (JBoss 7.1) 时,它运行良好。这让我觉得这只是一个错误识别错误的 Eclipse 问题。
抽象实体:
package com.xyc.abc;
import java.io.Serializable;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
@MappedSuperclass
public abstract class AbstractEntity implements Serializable
private static final long serialVersionUID = 1L;
private Long id;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getId()
return id;
public void setId(Long id)
this.id = id;
简单实体类示例:
@Entity
public class TestEntity extends AbstractEntity
...
我看到其他一些帖子说问题可能是超类中的注释在 getter 上而不是在字段上 - 如果您的实体中没有其他 JPA 注释,这只是一个问题,这我愿意。有什么想法吗?
【问题讨论】:
如果这是 getter/setter 问题,请尝试使用 @Access(AccessType.FIELD) 标记您的 AbstractEntity,并使用 @Access(AccessType.PROPERTY) 标记您的 getId()。这会解决吗? 不幸的是,这似乎没有任何区别。我也只是尝试使用 Eclipse Indigo 而不是 Juno,但这也没有什么不同。 【参考方案1】:看起来这与此处描述的错误有关:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=361042
最终修复它(实际上更多的是一种解决方法)是将AbstractEntity
添加到包含我的实体的项目中persistence.xml
的类列表中。尽管AbstractEntity
位于一个单独的JAR
中并且本身并不是一个具体的实体,但我想这为Eclipse 提供了足够的信息来停止抱怨。这似乎对应用程序本身没有任何不利影响。
【讨论】:
以上是关于Eclipse 中单独 JAR 中的 JPA @MappedSuperclass 导致验证错误“实体未定义主键属性”的主要内容,如果未能解决你的问题,请参考以下文章
eclipse 构建 jpa project 所需的用户库(vendor: EclipseLink)
mysql Connector J 版本 8 不适用于 JPA eclipse 实体生成
将 sqlite-jdbc-3.7.2.jar 放在 Eclipse 中的哪个位置以使其工作?
在 OSGI (Karaf) 中使用 EclipseLink JPA