如何在休眠中不继承 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)的主要内容,如果未能解决你的问题,请参考以下文章