如何在hibernate中继承Id GeneratedValue(在子类中禁用@GeneratedValue)

时间:2014-05-15 19:31:32

标签: java hibernate jpa orm hibernate-mapping

我有一个hibernate实体Super Class:

@MappedSuperclass
public abstract class Pojo_Entity_SuperClass 
{
   @Id
   @GeneratedValue(strategy=GenerationType.IDENTITY)
   @Column(name="ID", unique=true, nullable=false, precision=18, scale=0)
   protected long id;
   public Long getId() {return id;}

   //Other entity fields and methods
}

接下来我继承了这样的其他实体类:

@Entity
@Table(name="USR")
public class Usr extends Pojo_Entity_SuperClass 
{
   //Columns, fileds and others
}

但在某些情况下,我希望使用“id”字段继承实体而不使用@GeneratedValue注释。 问题是 - 如何在子类中禁用id的@GeneratedValue注释?

2 个答案:

答案 0 :(得分:2)

您可以简单地将@Id从基类移动到子类,然后决定生成策略。

所以你可以:

@MappedSuperclass
public abstract class Pojo_Entity_SuperClass 
{   
    public abstract Long getId();

    public abstract void setId(Long id);

    //Other entity fields and methods
}

@Entity
@Table(name="USR")
public class Usr extends Pojo_Entity_SuperClass {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="ID", unique=true, nullable=false, precision=18, scale=0)
    protected long id;  
}

@Entity
@Table(name="ADMIN")
public class Admin extends Pojo_Entity_SuperClass {
    @Id
    @SequenceGenerator(name = "ID_GENERATOR", sequenceName = "admin_id_seq")
    @GeneratedValue(generator = "ID_GENERATOR")
    @Column(name="ID", unique=true, nullable=false, precision=18, scale=0)
    protected long id;  
}

这是你需要的吗?

答案 1 :(得分:0)

或者,您实际上可能不想避免继承。在意识到要从外部系统创建ID为User的实体并将其强制为系统ID之前,我尝试执行相同的操作。由于实体是通过我们的id创建的,因此具有id和序列生成器的公共祖先是有效的解决方案,而具有外部id的User则是非系统的。

因此,像在任何其他情况下一样,生成User的id并向表和实体类添加另一列external_id都是恕我直言的。