MappedSuperclass - 在子类中更改SequenceGenerator

ata*_*man 26 java jpa sequence java-ee mappedsuperclass

我正在使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

rbe*_*nto 30

对的,这是可能的.您可以使用@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;
        }
    }
Run Code Online (Sandbox Code Playgroud)
    @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;
        }   
    }
Run Code Online (Sandbox Code Playgroud)
  • 这种方法在Hibernate 4.1.x中运行良好,但在EclipseLink 2.x中却没有.

编辑

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

  • 这是不正确的解决方案。只要您只有一个PersistentEntity子类,它就可以工作。假设您创建了实体“ Group”,该实体也扩展了PersistentEntity。然后会出现错误,因为在同一持久性单元内两次定义了序列生成器“ default_gen”。(EclipseLink 2.6.2) (4认同)
  • 实际上,正如JEE-7所规定的那样"生成器名称的范围对于持久性单元是全局的(跨所有生成器类型)." 因此,即使它在某些时候与某些实现一起工作,也不是标准行为. (3认同)

Mik*_*unu 12

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

  1. AttributeOverride用于覆盖列映射和
  2. AssociationOverride覆盖连接列/表.

他们都没有帮助GeneratedValue.