我想拥有一个对所有文档类型都通用的超类:
@Entity
public abstract class Doc implements Serializable
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected long docId;
    public long getDocId()
    {
        return docId;
    }
    public void setDocId(long docId)
    {
        this.docId = docId;
    }
}
我希望每个doc类型都有子类:
@Entity
@Table(name = "DocTypeA")
public class DocTypeA extends Doc implements Serializable
{
    // other child fields
}
但它给出了一个错误,并说DocTypeA需要一个主键.如何隔离主键并将其置于超类中?因为所有子类都具有相同的id字段.
我正在使用EclipseLink.
我的另一个问题是:为什么我需要加入@Entity抽象类?作为一个抽象类,它无法实例化,那么将它标记为实体有什么意义呢?真的有必要吗?我不会坚持超类.我只需要隔离所有子类中常见的代码.
堆栈跟踪很长,相关部分粘贴在下面:
Exception Description: Entity class [class repository.DocTypeA] has no primary key specified. It should define either an @Id, @EmbeddedId or an @IdClass. If you have defined PK using any of these annotations then make sure that you do not have mixed access-type (both fields and properties annotated) in your entity class hierarchy.
根据官方JavaDoc的注释@MappedSuperclass:
指定一个类,其映射信息应用于从其继承的实体.映射的超类没有为其定义单独的表.
这就是你要找的东西.因此,abstract类可以容易地用于实体的公共属性,在大多数情况下,主键或DB生成的对象标识符是.然后,仅为具体子类映射该抽象类的带注释字段:
使用
MappedSuperclass注释指定的类可以以与实体相同的方式映射,除了映射将仅应用于其子类,因为映射的超类本身不存在表.应用于子类时,继承的映射将应用于子类表的上下文中.
@Entity在抽象类中交换注释,Doc如下所示:
@MappedSuperclass
public abstract class Doc implements Serializable
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected long docId;
    //...
}
你应该好好去.
希望能帮助到你.
| 归档时间: | 
 | 
| 查看次数: | 1573 次 | 
| 最近记录: |