【问题标题】:How to not inherite Id GeneratedValue in hibernate (disable @GeneratedValue in child class)如何在休眠中不继承 Id GeneratedValue(在子类中禁用 @GeneratedValue)
【发布时间】: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 注释?

【问题讨论】:

    标签: java hibernate jpa orm hibernate-mapping


    【解决方案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 添加到表和实体类中。

    【讨论】:

      猜你喜欢
      • 2015-06-24
      • 1970-01-01
      • 2011-04-05
      • 1970-01-01
      • 2018-08-28
      • 2012-11-06
      • 2012-05-26
      • 1970-01-01
      • 2015-12-09
      相关资源
      最近更新 更多