我有一个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注释?
答案 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
都是恕我直言的。