0

私はオラクルでドクトリン2を使用しています.データベース内のテーブルにはIDを生成するいくつかのトリガーがあり、テーブルのIDマッピングは次のようになります:

/**
 * @orm\Id
 * @orm\Column(type="integer");
 * @orm\GeneratedValue(strategy="IDENTITY")
 */
protected $id;

私はOneToMany関係を持っていますが、cascade={"persist"}動作していません。MySQLで同じコードを試してみましたが、正常に動作していますが、オラクルでは、挿入された行の実際のIDではなく、最後の挿入IDが常に0を返すようです.. .そして、カスケードの永続化が機能していません...これはドクトリンのバグですか、それとも何か間違っていますか? 助けはありますか?

コードをたどった後、メソッドは

Doctrine\ORM\Id\IdentityGenerator::generate

は 0 を返します。が null であるため、なぜ呼び出されているのかわかりませんsequenceName(定義にシーケンスがありません!

編集: エンティティは次 のとおりです: クライアント エンティティ:

/** 
 * @ORM\Entity 
 * @ORM\Table(name="clients")
 **/
class Client {
    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     * @ORM\Column(type="integer")
     */
    protected $id;

    /** @ORM\Column(name="name",type="string",length=255,unique=true) */
    protected $name;

    /**
    * @ORM\OneToMany(targetEntity="ContactInformation", mappedBy="client", cascade={"persist"})
    **/
    protected $contactInformations;

    public function __construct() {
        $this->contactInformations = new ArrayCollection();
    }

    public function getId() {
        return $this->id;
    }

    public function getName() {
        return $this->name;
    }

    public function setName($name) {
        $this->name = $name;
        return $this;
    }

    public function getContactInformations() {
        return $this->contactInformations;
    }

    public function addContactInformations(Collection $contactInformations)
    {
        foreach ($contactInformations as $contactInformation) {
            $contactInformation->setClient($this);
            $this->contactInformations->add($contactInformation);
        }
    }

    /**
     * @param Collection $tags
     */
    public function removeContactInformations(Collection $contactInformations)
    {
        foreach ($contactInformations as $contactInformation) {
            $contactInformation->setClient(null);
            $this->contactInformations->removeElement($contactInformation);
        }
    }

    public function setContactInformations($contactInformations) {
        $this->contactInformations = $contactInformations;
        return $this;
    }
}

連絡先情報エンティティ:

/** 
 * @ORM\Entity 
 * @ORM\Table(name="contact_informations")
 **/
class ContactInformation {
    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     * @ORM\Column(type="integer")
     */
    protected $id;

    /**
     * @ORM\OneToOne(targetEntity="ContactInformationType")
     * @ORM\JoinColumn(name="type_id", referencedColumnName="id")
     **/
    protected $type;

    /** @ORM\Column(type="text") */
    protected $value;

    /**
     * @ORM\ManyToOne(targetEntity="Client", inversedBy="contact_informations")
     * @ORM\JoinColumn(name="client_id", referencedColumnName="id")
     **/
    private $client;

    public function getId() {
        return $this->id;
    }

    public function getType() {
        return $this->type;
    }

    public function setType($type) {
        $this->type = $type;
        return $this;
    }

    public function getValue() {
        return $this->value;
    }

    public function setValue($value) {
        $this->value = $value;
        return $this;
    }

    public function getClient() {
        return $this->client;
    }

    public function setClient($client = null) {
        $this->client = $client;
        return $this;
    }
}
4

1 に答える 1

0

Oracle は自動インクリメントをサポートしていないため、Doctrine で「IDENTITY」戦略を使用することはできません。「SEQUENCE」(または「AUTO」)戦略を使用する必要があります。

"AUTO" を指定すると、Doctrine は MySql には "IDENTITY" を、Oracle には "SEQUENCE" を使用します。

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/basic-mapping.html#identifier-generation-strategies

于 2013-07-19T12:55:07.797 に答える