Jakarta ee 具有抽象类继承的JPA实体

Jakarta ee 具有抽象类继承的JPA实体,jakarta-ee,ejb,jboss7.x,Jakarta Ee,Ejb,Jboss7.x,我有一个抽象类,它提供一些公共功能,这些功能是一些EJB实体要继承的。其中之一是时间戳列 public abstract class AbstractEntity { ... private long lastModified; ... @Column public long getLastModified() { return lastModified; } public void setLastModified(l

我有一个抽象类,它提供一些公共功能,这些功能是一些EJB实体要继承的。其中之一是时间戳列

public abstract class AbstractEntity {

    ...
    private long lastModified;
    ...

    @Column
    public long getLastModified() {
        return lastModified;
    }

    public void setLastModified(long ts) {
       lastModified = ts;
    }
}

问题是没有将timestamp列添加到数据库表中。是否有一些注释需要添加到AbstractEntity,以便将lastModified字段作为列继承

我尝试将@Entity添加到AbstractEntity,但这导致部署时出现异常

org.hibernate.AnnotationException: No identifier specified for entity:
AbstractEntity

你有几种可能

您没有为超类定义映射。如果假定它是可查询类型,则应使用
@Entity
对其进行注释,并且还需要
@Id
属性(此缺少的
@Id
属性是添加
@Entity
注释后出现错误的原因)

如果不需要将抽象超类作为可查询的实体,但希望将其属性作为其子类表中的列,则需要使用
@MappedSuperclass

如果您根本不注释您的超类,那么提供者认为它是暂时的,并且根本不映射

编辑:顺便说一句,您不必自己修改
lastModified
值(除非您真的想修改)-您可以让持久性提供程序在每次使用生命周期回调持久化实体时为您执行此操作:

@PreUpdate
void updateModificationTimestamp() {
 lastModified = System.currentTimeMillis();
}

您必须在AbstractEntity类的上面指定@MappedSuperclass注释。 这意味着您要指定在AbstractEntity类中注释的对象是扩展该类的类的一部分


您还需要注意jdbc表—映射的列名。

非常感谢Kostha—
@MappedSuperclass
注释正是我所寻找的解决方案。不客气:)我在您的代码中还注意到了一件事,也许你会发现它很有用-请看编辑。再次感谢Kostja-你的编辑正是我要做的。碰巧我必须自己修改
lastModified
,因为(一些)实体对象与客户机共享,数据通过XML和JAXB传输。@Dobbo我明白了,那么您更想知道实际修改时间,而不是持久时间。在我看来,修改时间是我计划的方式,然后任务客户端可以轮询自上次轮询以来请求的更新。我不喜欢投票,但考虑到这些天的防火墙规则,我看不到其他选择。我还计划用
@Version
注释标记
lastUpdate
,并实现乐观并发控制。它看起来非常适合我的客户机/服务器关系。但如果您知道更好的/替代解决方案,我欢迎您提出建议。
@PreUpdate
void updateModificationTimestamp() {
 lastModified = System.currentTimeMillis();
}