2016-10-19 12 views
0

私はDoctrineとSymfonyを使ってOracleデータベースに接続しています。ほとんどの問題はうまくいきますが、データベースにレコードを追加するだけで、番号が間違っていて、シーケンスが2になっています。OracleでSymfonyとDoctrineを使用しているときに、正しく追加されていないIDを2で返している場合

エンティティでは、プライマリ

/** 
* @var integer 
* 
* @ORM\Column(name="PK", type="integer", nullable=false) 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="SEQUENCE") 
* @ORM\SequenceGenerator(sequenceName="SEQ_GET_LOCATIONS_PK", allocationSize=1, initialValue=1) 
*/ 
private $pk; 

私はデータを追加し、私はPK戻ったら:私はトリガーを持っているデータベースで

$newMap = new Locations(); 
$newMap->setName($mapName); 
$em = $this->getDoctrine()->getManager(); 
$em->persist($newMap); 
$em->flush(); 
$mapId = $newMap->getPk(); 

を:私が持っているキー

create or replace TRIGGER insert_locations 
Before Insert On "LOCATIONS" Referencing NEW AS NEW 
For Each Row 
    Begin 
    SELECT SEQ_GET_LOCATIONS_PK.nextval into :new.pk from dual; 
END; 

とシーケンス:

CREATE SEQUENCE "SCHEMA"."SEQ_GET_LOCATIONS_PK" MINVALUE 14 MAXVALUE 99999999999999999999 INCREMENT BY 1 START WITH 109 CACHE 20 NOORDER NOCYCLE ; 

過去のPKは、私は新しいものが96であることを期待し、95言った、そしてそれが価値であることを期待するならば、私は、データベースに新しい項目を追加します$ mapIdのしかし、データベースでは、返される値は96ですが、PKは97です!

私は、トリガーとは何かが残っているのか(それは過去の非symfonyバージョンのソフトウェアのものだったのでしょうか)、何か、私はトリガーを削除しても問題は残っているのだろうかと思います。

これはDoctrineのバグですか?

答えて

1

この問題は今後発生します。それはトリガーに終わった、私はそれを実行することを停止する別のテーブルに指摘していたが、それはまだ働いていたので、それをコンパイルすることを忘れていた。 (テスト目的のために)そこにトリガーを維持し、まだすべての仕事を持っている、にトリガーを変更するには:

create or replace trigger insert_locations 
Before Insert On "LOCATIONS" Referencing NEW AS NEW 
FOR EACH ROW 
    BEGIN 
    IF :NEW.pk is NULL THEN 
    SELECT SEQ_GET_LOCATIONS_PK.nextval INTO :NEW.pk FROM dual; 
    END IF; 
END; 

原因:私は教義/ symfonyのから新しい行を挿入するとを、教義は、配列を見て、次の番号を取得します。挿入する問合せをOracleに送信すると、Oracleはトリガーを起動し、トリガーがシーケンスを探します。 Doctrineはすでにシーケンスを取得しているので、シーケンスが再び増加し、Doctrineが知らない新しいキーが与えられます。

ソリューション:トリガーを削除する(私は手動でデータベースに項目を追加してテストできるようにしておきたい)、トリガーにチェックを入れてIDを置き換えることができます供給されていません。

関連する問題