5

私たちのデータベースには、単一の自動インクリメント主キーがなく、代わりに複合テーブルがあり、その主キーの最初のフィールドとして自動インクリメントフィールドが含まれる場合と含まれない場合があります。

例えば:

DROP TABLE IF EXISTS `gen_5_23`;
CREATE TABLE IF NOT EXISTS `gen_5_23` (
    `id_azienda` int(10) unsigned NULL DEFAULT 1,
    `id_sede` int(10) unsigned NULL DEFAULT 1,
    `revisione_documento` int(10) unsigned NULL DEFAULT 0,
    `premessa_generale` text,
    `flag_stampa` char(1) DEFAULT 'N',
    PRIMARY KEY (`id_azienda`,`id_sede`,`revisione_documento`),
    CONSTRAINT `fk_revisione_documento_gen_5_23` FOREIGN KEY (`revisione_documento`, `id_azienda`, `id_sede`) REFERENCES `agews_revisioni_documenti` (`revisione_documento`, `id_azienda`, `id_sede`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `gen_5_23_consumi`;
CREATE TABLE IF NOT EXISTS `gen_5_23_consumi` (
    `id_consumo` int(10) unsigned AUTO_INCREMENT,
    `id_azienda` int(10) unsigned NULL DEFAULT 1,
    `id_sede` int(10) unsigned NULL DEFAULT 1,
    `revisione_documento` int(10) unsigned NULL DEFAULT 0,
    `consumo` varchar(255) NULL DEFAULT NULL,
    `unita` varchar(255) NULL DEFAULT NULL,
    `valore` float(11,2) NULL DEFAULT 0,
    PRIMARY KEY (id_consumo,`id_azienda`,`id_sede`,`revisione_documento`),
    CONSTRAINT `fk_main_gen_5_23_consumi` FOREIGN KEY (`id_azienda`, `id_sede`, `revisione_documento`) REFERENCES `gen_5_23` (`id_azienda`, `id_sede`, `revisione_documento`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

gen_5_23_consumiのキーは、次のように定義されます。これは、Webアプリケーションに行を盲目的に取得し、id_azienda、id_sede、revisione_documentoのみを変更してから再挿入するプロシージャがあるためです。このようにすると、行は有効になりますが、そうではありません。主キーがid_consumoのみだった場合。

データベース管理にドクトリン2の使用を開始することを検討していますが、可能であれば、そのようなエンティティをどのように実装するかについては、ドキュメントからはわかりません。

4

2 に答える 2

3

それは可能ですが、そのままではできません。エンティティの主キーとして複合キーを使用できます: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.htmlただし、自動インクリメントの実装を行う必要がありますあなたのコードで

複合キーを持つすべてのエンティティは、「ASSIGNED」以外の ID ジェネレーターを使用できません。つまり、EntityManager#persist($entity) を呼び出す前に、ID フィールドの値を設定する必要があります。

自動インクリメント動作をエミュレートするには、自動インクリメント PK として id を持つシーケンス テーブルを作成し、このテーブルのエンティティを作成します。メイン エンティティから自動インクリメント シーケンスを表すエンティティへの関係を追加します。上のページの ArticleAttribute クラスを参照してください。コードは非常に似ているはずです。

Class Gen523consumiAuto
{
    /** @Id @Column(type="integer") @GeneratedValue */
    private $id;
}

Class Gen523consumi
{
    /** @Id @OneToOne(targetEntity="Gen523consumiAuto") */
    private $idConsumo;

    /** @Id @Column(type="integer") */
    private $idAzienda;

    /** @Id @Column(type="integer") */
    private $idSede;

    /** @Id @Column(type="integer") */
    private $revisioneDocumento;
}
于 2012-07-25T22:41:25.553 に答える