我使用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。
对的,这是可能的。 您可以覆盖与默认生成的名字@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;
}
}
@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合作。
在JPA不能用注解来完成。 注释本身不能被重写。 实体继承了所有的映射信息MappedSuperClass 。 有只有两个可用于重新定义从映射超类继承映射注释:
- AttributeOverride来覆盖列映射和
- AssociationOverride覆盖连接列/表。
他们都不有助于GeneratedValue。
随着EclipseLink的,你可以使用一个Customizer
。 DescriptorCustomizer
接口定义了一个方法来定制所有关于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 {
...
}