【问题标题】:Hibernate Annotation Inheriting Abstract Base ClassHibernate注解继承抽象基类
【发布时间】:2012-05-20 17:30:14
【问题描述】:

在我的应用程序中,我试图通过注释来实现 Hibernate 映射。我有一个抽象的基类,在这个类中存在 Id 属性。我正在用一个子类继承这个基类。代码如下:

@MappedSuperclass
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class Base implements IBase {

    private static final long serialVersionUID = -1433573674276444516L;

    private int id;

    public Base() {

    }

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)   
    @Column(name="ID")
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

而子类是:

@Entity
@Table(name="USER")
public class User extends Base implements IUser {

    private static final long serialVersionUID = 344528694909088439L;

    private String name;

    public User() {

    }

    @Column(name="NAME", nullable=false)
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }   
}

它正在创建 USER 表并且工作正常。

我想知道我的做法是否正确。

谢谢。

【问题讨论】:

    标签: java inheritance annotations hibernate-4.x


    【解决方案1】:

    如果目标只是让几个独立的实体从基类继承一个公共字段,那么不,你没有正确地做到这一点。注释@Inheritance 是不必要的。当您拥有一个实体(例如车辆)和多个子实体(例如汽车、自行车)时,@Inheritance 是必需的。

    【讨论】:

    • 感谢您的回复。如果我从 Base 中删除 @MappedSuperclass 和 @Inheritance(strategy=InheritanceType.JOINED),但在 Id 上保留 Annotation,那么我会收到异常:org.hibernate.AnnotationException:没有为实体指定标识符:app.dev.ems .data.model.impl.User
    • 不要删除 MappedSuperclass 注释。只有继承注释。这是一个或另一个。你想要的就是 MappedSuperclass。你读过他们的 javadoc 吗?
    猜你喜欢
    • 1970-01-01
    • 2011-04-19
    • 2014-02-19
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    相关资源
    最近更新 更多