6

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

public abstract class AbstractEntity {

    ...
    private long lastModified;
    ...

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

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

@Table
@Entity
public class MyEntity extends AbstractEntity {
    ...
    private Long key;
    private String value;
    ...

    @Id
    public Long getKey() {
        return key;
    }

    public void setKey(Long k) {
        key = k;
    }

    @Column
    public String getValue() {
        return value;
    }

    public void setValue(String txt) {
        value = txt;
        setLastModified(System.currentTimeMillis());
    }
}

问题是时间戳列未添加到数据库表中。是否需要将一些注释添加到 AbstractEntity 以便将 lastModified 字段作为列继承?

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

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

2 回答 2

15

您在这里有几种可能性。

您没有为您的超类定义映射。如果它应该是一个可查询的类型,你应该用它来注释它,@Entity你还需要一个@Id属性(这个缺失的属性是你在添加注释@Id后得到错误的原因 )@Entity

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

如果你根本不注释你的超类,它被提供者认为是瞬态的,根本没有映射。

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

@PreUpdate
void updateModificationTimestamp() {
 lastModified = System.currentTimeMillis();
}
于 2013-01-17T12:53:58.480 回答
0

您必须在 AbstractEntity 类的上方指定 @MappedSuperclass 注释。这意味着您指定在 AbstractEntity 类中注释的任何部分都是您扩展此类的类的一部分。

而且您还需要注意 jdbc 表 - 映射的列名。

于 2013-03-20T13:09:57.277 回答