如何在休眠中不继承 Id GeneratedValue(在子类中禁用 @GeneratedValue)

Posted

技术标签:

【中文标题】如何在休眠中不继承 Id GeneratedValue(在子类中禁用 @GeneratedValue)【英文标题】:How to not inherite Id GeneratedValue in hibernate (disable @GeneratedValue in child class) 【发布时间】:2014-05-15 19:31:31 【问题描述】:

我有一个休眠实体超类:

@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

但在某些情况下,我想在没有 @GeneratedValue 注释的情况下继承具有“id”字段的实体。 问题是 - 如何在子类中为 id 禁用 @GeneratedValue 注释?

【问题讨论】:

【参考方案1】:

您可以简单地将@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;  

这是你需要的吗?

【讨论】:

在我的情况下这不是解决方案,因为我在我的所有实体中都使用了 id 并且某些类继承了三个或更多级别。在我的超级类中,我也有很多处理 id 的方法。 也许我应该在 hibernate 中编写自己的 ID 生成器,并在我的子类中使用一些注释来覆盖它? 我更新了我的回复以适应抽象的 getId 和 setId 方法。这样你也可以在你的超类方法中引用它们。我认为您可以尝试将 @Id 从字段移动到方法,并且可能是覆盖也会覆盖生成。但是方法级别annotation is much trickier than field level. 你甚至可以混合field with property level access type。我认为值得尝试在属性级别使用 @Id 并查看覆盖是否以这种方式更适合您。【参考方案2】:

或者,您可能实际上不想避免继承。在我意识到我想用来自外部系统的 id 创建User 实体并在我的系统中强制这个 id 作为 id 之前,我尝试做同样的事情。由于实体是使用我们的 id 创建的,因此具有 id 和序列生成器的共同祖先是有效的解决方案,而具有外部 id 的User 将是非系统的。

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

【讨论】:

以上是关于如何在休眠中不继承 Id GeneratedValue(在子类中禁用 @GeneratedValue)的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate 更新一对一的单向

在休眠中使用继承时如何仅获取一种实体?

我需要帮助来实现特定的休眠继承映射

使用休眠和弹簧更新

事务在休眠中不回滚

zeroDateTimeBehavior=convertToNull 在使用休眠的 jdbc url 中不起作用