在子类的Hibernate中为每个表指定不同的序列

时间:2010-12-30 07:25:56

标签: java hibernate postgresql sequence

如果在映射的超类中定义了ID,有没有办法为Hibernate中的每个表指定不同的序列?

我们应用程序中的所有实体都扩展了一个名为DataObject的超类,如下所示:

@MappedSuperclass
public abstract class DataObject implements Serializable {
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "id")
    private int id;
}

@Entity
@Table(name = "entity_a")
public class EntityA extends DataObject { ... }

@Entity
@Table(name = "entity_b")
public class EntityB extends DataObject { ... }

这会导致所有实体使用共享序列,默认为hibernate_sequence

我想要做的是为每个实体使用单独的序列,例如上面示例中的entity_a_sequenceentity_b_sequence。如果在子类上指定了ID,那么我可以使用@SequenceGenerator注释为每个实体指定序列,但在这种情况下,ID在超类上。鉴于ID在超类中,是否有一种方法可以为每个实体使用单独的序列 - 如果是,那么如何?

(我们正在使用PostgreSQL 8.3,如果相关的话)

4 个答案:

答案 0 :(得分:35)

你尝试过这样做吗?

@MappedSuperclass
public abstract class DataObject implements Serializable {
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "idgen")
    @Column(name = "id")
    private int id;
}

@Entity
@SequenceGenerator(initialValue = 1, name = "idgen", sequenceName = "entityaseq")
@Table(name = "entity_a")
public class EntityA extends DataObject { 

}

@Entity
@SequenceGenerator(initialValue = 1, name = "idgen", sequenceName = "entitybseq")
@Table(name = "entity_b")
public class EntityB extends DataObject {

}

对不起,我现在没有必要的测试环境,但我会稍后再试。

答案 1 :(得分:1)

TABLE生成策略为每个表使用单独的数据库序列,但操作费用不高

答案 2 :(得分:0)

IHMO有更好的方法:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

它适用于我的应用。

答案 3 :(得分:0)

我对需要分别在每个类上声明序列名称感到不满意。我已经检查了源代码并提出了以下解决方案:

import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;
import org.hibernate.id.enhanced.SequenceStyleGenerator;

// ...

@Id
@GeneratedValue(generator = "sequenceIdGenerator")
@GenericGenerator(
        name = "sequenceIdGenerator", 
        strategy = "sequence",
        parameters = @Parameter(
                name = SequenceStyleGenerator.CONFIG_PREFER_SEQUENCE_PER_ENTITY,
                value = "true"))
@Column(updatable = false, nullable = false)
protected Long id;