我正在使用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。
发布于 2015-09-12 01:36:01
在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 {
...
}
发布于 2019-10-24 22:17:38
我写这篇文章是因为它太难读了,因为它是对公认答案的评论:
我有一个其他实体都继承的BaseEntity
:
BaseEntity.java:
@MappedSuperclass
public abstract class BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_ID")
private Long id;
然后我有两个实体User
和Order
,这两个实体都继承自BaseEntity
,同时也有@SequenceGenerator
注释:
User.java:
@SequenceGenerator(name = "SEQ_ID", sequenceName = "SEQ_USER", allocationSize = 1)
public class User extends BaseEntity { ... }
Order.java:
@SequenceGenerator(name = "SEQ_ID", sequenceName = "SEQ_ORDER", allocationSize = 1)
public class Order extends BaseEntity { ... }
它至少可以在H2上使用2个序列SEQ_USER
和SEQ_ORDERS
select SEQ_USER.nextval from dual;
select SEQ_ORDERS.nextval from dual;
https://stackoverflow.com/questions/8589928
复制相似问题