MappedSuperclass - 更改SequenceGenerator子类中MappedSu

2019-05-11 22:38发布

我使用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;
    }
}

然而,对于每个表那里有一个序列$entityname_seq ,我想我的序列发生器使用。 如何设置,从我的子类? 我想我需要重写@GeneratedValue并创建@SequenceGenerator新SequenceGenerator。

Answer 1:

对的,这是可能的。 您可以覆盖与默认生成的名字@SequenceGenerator注解。

  • Base类
    @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合作。


Answer 2:

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

  1. AttributeOverride来覆盖列映射和
  2. AssociationOverride覆盖连接列/表。

他们都不有助于GeneratedValue。



Answer 3:

随着EclipseLink的,你可以使用一个CustomizerDescriptorCustomizer接口定义了一个方法来定制所有关于JPA描述符(又名持久实体)的信息。

public class SequenceCustomizer implements DescriptorCustomizer {

    @Override
    public void customize(ClassDescriptor descriptor) throws Exception {
        descriptor.setSequenceNumberName(descriptor.getTableName());
    }
}

并在您定义的超:

@MappedSuperclass
@Customizer(SequenceCustomizer.class)
public abstract class AbstractEntity implements Serializable {
    ...
}


文章来源: MappedSuperclass - Change SequenceGenerator in Subclass