単方向ツリーを持つ DB テーブルがあります。これらの木の葉は、複数の子/親を持つことができます。サイクルは制限されています。これが私のDBテーブルの定義です:
CREATE MULTISET TABLE WORKFLOW_SEQ_REL ,NO FALLBACK ,
NO BEFORE JOURNAL,
NO AFTER JOURNAL,
CHECKSUM = DEFAULT,
DEFAULT MERGEBLOCKRATIO
(
WORKFLOW_SEQ_ID INTEGER NOT NULL,
REL_WORKFLOW_SEQ_ID INTEGER NOT NULL,
JOB_ID BIGINT)
PRIMARY INDEX ( WORKFLOW_SEQ_ID );
ご覧のとおり、現在は主キーがありません。しかし、後で表示されます :) 実際の PK は、JOB_ID+PARENT_ID+CHILD_ID です。
アイデアは次のとおりです。
- REL_WORKFLOW_SEQ_ID = 親
- WORKFLOW_SEQ_ID = 子
- JOB_ID = TREE_IDENTIFICATOR (1 つのテーブルに格納された異なるツリーを分離する決定要因)。
JPAエンティティを宣言しようとしています:
@Entity
@Table(name="WORKFLOW_SEQ_REL")
public class EtlWorkflowSeqNode {
@EmbeddedId
public EtlWorkflowSeqNodeId etlWorkflowSeqNodeId;
//@Column(name="JOB_ID")
//public Integer jobId;
@Embeddable
class EtlWorkflowSeqNodeId{
@Column(name="JOB_ID")
public Integer jobId;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="REL_WORKFLOW_SEQ_ID")
//EtlWorkflowSeq.id = PK of EtlWorkflowSeq entity
public EtlWorkflowSeq parent;
@OneToMany(fetch=FetchType.EAGER /*, mappedBy="parent"*/)
@JoinColumn(name="WORKFLOW_SEQ_ID")
public Set<EtlWorkflowSeq> children;
}
}
エラーが発生しました: 原因: org.hibernate.AnnotationException: A Foreign key refering models.EtlWorkflowSeqNode from models.EtlWorkflowSeq has the wrong number of column. 2である必要があります
EtlWorkflowSeq エンティティは次のとおりです。
@Entity
@Table(name="WORKFLOW_SEQ")
public class EtlWorkflowSeq {
@Id
@Column(name="WORKFLOW_SEQ_ID")
public Integer id;
@OneToOne(fetch=FetchType.EAGER)
@JoinColumn(name="WORKFLOW_ID")
public EtlWorkflow etlWorkflow;
}
私は何を間違っていますか?
UPD: テーブル定義は次のとおりです: -- 悪い設計です。PK は次のようになります: WORKFLOW_SEQ_ID + REL_WORKFLOW_SEQ_ID + JOB_ID
CREATE MULTISET TABLE WORKFLOW_SEQ_REL ,NO FALLBACK ,
NO BEFORE JOURNAL,
NO AFTER JOURNAL,
CHECKSUM = DEFAULT,
DEFAULT MERGEBLOCKRATIO
(
WORKFLOW_SEQ_ID INTEGER NOT NULL, --a ref to child
REL_WORKFLOW_SEQ_ID INTEGER NOT NULL, -- a ref to parent
START_TYPE_ID SMALLINT NOT NULL, -- a type of connection
DISABLE_START_TYPE_ID SMALLINT, -- other type of connection
JOB_ID BIGINT) -- a tree determinant,
PRIMARY INDEX ( WORKFLOW_SEQ_ID );
CREATE MULTISET TABLE WORKFLOW_SEQ ,NO FALLBACK ,
NO BEFORE JOURNAL,
NO AFTER JOURNAL,
CHECKSUM = DEFAULT,
DEFAULT MERGEBLOCKRATIO
(
WORKFLOW_SEQ_ID INTEGER NOT NULL, -- an id
WORKFLOW_ID BIGINT NOT NULL, -- a ref to original workflow, not interesting
IS_NAME VARCHAR(255) CHARACTER SET UNICODE NOT CASESPECIFIC, -- some name
INFO_SYSTEM_INST_CD VARCHAR(255) CHARACTER SET UNICODE NOT CASESPECIFIC, -- other name
DISABLE BYTEINT) -- so garbage
UNIQUE PRIMARY INDEX ( WORKFLOW_SEQ_ID ); -- it should also be a PK
複数のツリーが WORKFLOW_SEQ_REL JOB_ID に格納されているという考えは、ツリーの決定要因です。WORKFLOW_SEQ_ID、REL_WORKFLOW_SEQ_ID は、REL_WORKFLOW_SEQ テーブルからカスタマイズされたテンプレートを参照します。