映射超类 - 更改子类中的序列生成器

我将 JPA2 与 Hibernate 一起使用,并尝试为我的实体引入一个通用基类。到目前为止,它看起来像这样:

@MappedSuperclass
public abstract class BaseEntity {

    @Id
    private Long id;

    @Override
    public int hashCode() {
        // ...
    }

    @Override
    public boolean equals(Object obj) {
        // ...
    }

    public Long getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }
}

但是,对于每个表,都有一个序列,我想将其用作序列生成器。如何从我的子类中设置它?我认为我需要覆盖@GeneratedValue,并使用@SequenceGenerator创建新的SequenceGenerator。$entityname_seq


答案 1

是的,这是可能的。您可以使用注释覆盖默认生成器名称。@SequenceGenerator

  • 基类
    @MappedSuperclass
    public abstract class PersistentEntity implements Serializable
    {
        private static final long serialVersionUID = 1L;

        @Id
        @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "default_gen")
        protected Long id = 0L;

        public Long getId()
        {
            return id;
        }

        public void setId(Long id)
        { 
            this.id = id;
        }
    }
  • 序列 (SQL)

    create sequence role_seq;
  • 派生类

    @Entity
    @Table(name = "role")
    @SequenceGenerator(name = "default_gen", sequenceName = "role_seq", allocationSize = 1)
    public class Role extends PersistentEntity implements Serializable
    {
        private static final long serialVersionUID = 1L;

        @NotNull
        @Size(max = 32)
        private String name;

        public String getName()
        {
             return name;
        }

        public void setName(String name)
        {
             this.name = name;
        }   
    }
  • 这种方法在Hibernate 4.1.x中工作正常,但在EclipseLink 2.x中却没有。

编辑

  • 根据评论,它似乎正在与EclipseLink 2.6.1-RC1一起使用。

答案 2

在JPA中,不能用注释来完成。注释本身不能被覆盖。实体从 MappedSuperClass 继承所有映射信息。只有两个注释可用于重新定义从映射的超类继承的映射:

  1. 属性覆盖以覆盖列映射和
  2. 关联覆盖连接列/表的重写。

它们都无助于生成值。


推荐