Java 使用@Inheritation JPA属性时插入顺序无效
我已经在DB2DB上调试了Eclipselink持久性提供程序。其中有3个表,简化定义如下:Java 使用@Inheritation JPA属性时插入顺序无效,java,inheritance,jpa,jpa-2.0,eclipselink,Java,Inheritance,Jpa,Jpa 2.0,Eclipselink,我已经在DB2DB上调试了Eclipselink持久性提供程序。其中有3个表,简化定义如下: 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_
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实体类,
根实体:
@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;
}
...
}
衍生实体:
@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;
}
...
}
我在测试日志中没有看到派生表插入:
--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在插入到次要表之前不将新记录插入到派生的表中
另外,当没有辅助表(ROOT
和DERIVED
表)或没有使用继承(DERIVED
表生成id)时,一切都正常工作。对于继承,JPA假设相关表中的外键约束引用根表
您可以更改约束以引用根表,或者
使用描述符设置
descriptor.setHasMultipleTableConstraintDependecy(true);
或者
自定义OneToOneMapping,使其外键引用辅助表(JPA注释始终使其引用根表)
不过,请记录一个bug,因为JPA联接列应该允许您定义辅助表的外键
EclipseLink延迟插入到辅助表的原因是允许插入按表分组,以允许批量写入并避免数据库死锁。如果指定辅助关系的CascadeType,是否会有所不同?@Deniz,CascadeType在此处无法按预期工作/谢谢。第一种方法对我有效。第二种方法导致“此描述符中不存在表[派生的]。”