我在持久化的继承实体上有一个奇怪的自动生成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文档中,此参数表示递增,但它是'不同的工作不知道为什么。