首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用@Inheritance JPA属性时插入顺序无效

使用@Inheritance JPA属性时插入顺序无效
EN

Stack Overflow用户
提问于 2012-06-25 23:23:27
回答 1查看 3.3K关注 0票数 2

我已经在DB2 DB上调优了Eclipselink持久化提供程序。下面列出了3个简化定义的表格:

代码语言:javascript
复制
CREATE TABLE root
(
    id       CHAR(32) NOT NULL PRIMARY KEY,
    rec_type VARCHAR(20)
);

CREATE TABLE derived
(
    id CHAR(32) NOT NULL PRIMARY KEY,
    ...
);
ALTER TABLE derived ADD CONSTRAINT fk_derived_to_root FOREIGN KEY (id) REFERENCES root(id);

CREATE TABLE secondary
(
    derived_id NOT NULL PRIMARY KEY,
    ...
);
ALTER TABLE secondary ADD CONSTRAINT fk_secondary_to_derived FOREIGN KEY (derived_id) REFERENCES derived(id);

下面列出了这些实体的Java实体类,RootEntity:

代码语言:javascript
复制
@javax.persistence.Table(name = "ROOT")
@Entity
@DiscriminatorColumn(name = "REC_TYPE")
@Inheritance(strategy = InheritanceType.JOINED)
public class RootEntity {
    private String id;

    @javax.persistence.Column(name = "ID")
    @Id
    @GeneratedValue(generator = "system-uuid")
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    private String principalType;
    @Column(name = "PRINCIPAL_TYPE")
    public String getPrincipalType() {
        return principalType;
    }

    public void setPrincipalType(String principalType) {
        this.principalType = principalType;
    }
   ...
}

DerivedEntity:

代码语言:javascript
复制
@javax.persistence.Table(name = "DERIVED")
@Entity
@DescriminatorValue("DERIVED")
public class DerivedEntity extends RootEntity {
    private SecondaryEntity secondaryEntity;

    @OneToOne(mappedBy = "derived_id")
    public SecondaryEntity getSecondaryEntity() {
        return secondaryEntity;
    }

    public void setSecondaryEntity(SecondaryEntity secondaryEntity) {
        this.secondaryEntity = secondaryEntity;
    }
 ...
}

我在测试日志中没有看到派生表插入:

代码语言:javascript
复制
--INSERT INTO ROOT (ID, REC_TYPE) VALUES (?, ?)
    bind => [241153d01c204ed79109ce658c066f4c, Derived]
--INSERT INTO SECONDARY (DERIVED_ID, ...) VALUES (?, ...)
    bind => [241153d01c204ed79109ce658c066f4c, ...]
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.ibm.db2.jcc.am.fo: DB2 SQL Error: SQLCODE=-530, SQLSTATE=23503, SQLERRMC=SCHEM.SECONDARY.FK_SECONDARY_TO_DERIVED, DRIVER=3.57.82

所以问题是:为什么Eclipselink不在插入到SECONDARY表之前插入新记录到DERIVED表?

附注:当没有使用SECONDARY表(仅限ROOTDERIVED表)或没有使用继承(DERIVED表生成id)时,一切都正常工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-26 20:36:14

对于继承,JPA假定相关表中的外键约束引用根表。

您可以更改约束以引用根表,或者,

使用DescriptorCustomizer进行设置,

代码语言:javascript
复制
descriptor.setHasMultipleTableConstraintDependecy(true);

或,

定制OneToOneMapping,使其外键引用辅助表(JPA注解总是使其引用根表)。

但是,请记录一个bug,因为JPA连接列应该允许您定义到辅助表的外键。

EclipseLink将插入延迟到辅助表的原因是允许按表对插入进行分组,从而允许批量写入并避免数据库死锁。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11192246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档