JPA自动生成的继承实体的id不会按超类

时间:2017-04-17 18:57:46

标签: jpa eclipselink sequence id-generation sequence-generators

我在持久化的继承实体上有一个奇怪的自动生成ID行为。我有一个带有序列生成器的人实体,它增加4并且工作正常。我有两个其他实体Client和Agent继承Person并使用person id作为pk。 我有一个Policy实体,其中包含3个已连接的实体:2个客户端和代理。 当我坚持政策时 [实体经理]坚持(政策)它呼叫

select nextval('sk_db.person_id_sequence')

对于第一个客户端,并按照假设要增加id,但是当持久保存其他2个实体时:客户端和代理,它只调用:

select lastval()

并按1增加1而不是4。我无法理解这种行为。我错过了什么?

我用: JPA EclipseLink 和 的 PostgreSQL的

@Entity
@Table(name = "Person", schema = Constraints.DB_SCHEMA)
public class TPerson implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @SequenceGenerator(name = "personIdGenerator", sequenceName = "person_id_sequence", initialValue = 6, allocationSize = 4)
    @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "personIdGenerator")
    protected long id;
    ...
}

客户端和代理类:

@Entity
@Table(name = "Client", schema = Constraints.DB_SCHEMA)
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorValue(value = "Client")
public class TClient extends TPerson implements Serializable {

    private static final long serialVersionUID = 1L;
    ...
}

加入关系的政策类:

@Entity
@Table(name = "Policy", schema = Constraints.DB_SCHEMA)
@DiscriminatorColumn(name = "classType")
public class TPolicy implements Serializable {

    private static final long serialVersionUID = 1L;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "policyOwnerId", referencedColumnName = "id", updatable = false, insertable = false)
    private TPerson policyOwner;

    @OneToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH })
    @JoinColumn(name = "agentId", referencedColumnName = "id", updatable = false, insertable = false)
    private TAgent agent;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "transportOwnerId", referencedColumnName = "id", updatable = false, insertable = false)
    private TPerson transportOwner;

我的架构:

CREATE SEQUENCE sk_db.person_id_sequence INCREMENT BY 4 START 2 CYCLE;

create table if not exists SK_DB.Person 
(
  id bigserial PRIMARY KEY,
  ..
);

create table if not exists SK_DB.Client
(
  id bigserial REFERENCES SK_DB.Person(id),
  ..
)

create table if not exists SK_DB.Agent
(
  id bigserial REFERENCES SK_DB.Person(id),
  ..
)

坚持政策后:

em.persist(policy);

我在日志中收到:

    [EL Fine]: sql: ... --select nextval('sk_db.person_id_sequence')
    ..
    [EL Fine]: sql: ....--select lastval()
    [EL Fine]: sql: ....--INSERT INTO sk_db.Person (ID,....) VALUES (...)
    bind => [48, ....]
    [EL Fine]: sql: ....--select lastval()
    [EL Fine]: sql: ....--INSERT INTO sk_db.Person (ID,....) VALUES (...)
    bind => [49, ....]
    [EL Fine]: sql: ....--select lastval()
    [EL Fine]: sql: ....--INSERT INTO sk_db.Person (ID,....) VALUES (...)
    bind => [47, ....]

但是自动生成的ID应为:50,54,58

在数据库序列中,我在insert:

之前看到

当前值:46 下一个值:50

插入后:

当前值:50 下一个值:54

在下一次持续中,我会收到以下ID: 52,51,50。

SOLUTION:

将allocationSize更改为1是固定的,当设置此参数指示缓存时,将从下一个值增加下一个值的次数,直到它将从数据库中获取下一个值。在javaee api文档中,此参数表示递增,但它是'不同的工作不知道为什么。

0 个答案:

没有答案