the anser is simple: the doctrine doku say something like that:
> When you do not use the SchemaTool to generate the required SQL you
should know that deleting a class table inheritance makes use of the
foreign key property ON DELETE CASCADE in all database implementations. A
failure to implement this yourself will lead to dead rows in the database.
so it is not realy clear why is to set a onDelete cascade by database. the
code clear this:
JoinedSubclassPersister.php:274
// If the database platform supports FKs, just
// delete the row from the root table. Cascades do the rest.
if ($this->platform->supportsForeignKeyConstraints()) {
$rootClass =
$this->em->getClassMetadata($this->class->rootEntityName);
$rootTable = $this->quoteStrategy->getTableName($rootClass,
$this->platform);
$this->conn->delete($rootTable, $id);
return;
}
so, just set the "onDelete=CASCADE" on all subTables and all works fine!
greez,
hoessi!
Am Mittwoch, 11. Juni 2014 21:33:39 UTC+2 schrieb Björn Zeutzheim:
>
> Hi there I have a problem with doctrine in symfony.
>
> I have the following entities:
>
> /**
> * FourTeachersSchuldruckBundle:Product
> *
> * @ORM\Entity
> * @ORM\Table(name="product")
> * @ORM\InheritanceType("JOINED")
> * @ORM\DiscriminatorColumn(name="type", type="string")
> * @ORM\DiscriminatorMap({"heft" = "ModuleProduct"})
> * @ORM\HasLifecycleCallbacks
> */
> abstract class Product {
> // ....
> }
>
> /**
> * @ORM\Entity
> * @ORM\Table(name="product_module")
> */
> class ModuleProduct extends Product {
> /**
> * @var \Doctrine\Common\Collections\Collection
> * *@ORM\OneToMany(targetEntity="Module", mappedBy="product",
> cascade={"all"}, orphanRemoval=true)*
> * @ORM\OrderBy({"orderId" = "ASC"})
> */
> private $modules;
> }
>
> /**
> * @ORM\Entity
> * @ORM\Table(name="module")
> * @ORM\InheritanceType("JOINED")
> * @ORM\DiscriminatorColumn(name="type", type="string")
> */
> abstract class Module {
>
> /**
> * @var \FourTeachers\SchuldruckBundle\Entity\ModuleProduct
> * @ORM\ManyToOne(targetEntity="ModuleProduct", inversedBy="modules")
> * @ORM\JoinColumn(name="product_id", nullable=true)
> */
> private $product;
>
> }
>
> Now when I try to delete a certain ModuleProduct entity, I get the
> following error:
>
> \DBALException: An exception occurred while executing 'DELETE FROM product
> WHERE id = ?' with params [9]: SQLSTATE[23000]: Integrity constraint
> violation: 1451 Cannot delete or update a parent row: a foreign key
> constraint fails (`schuldruck`.`module`, CONSTRAINT `FK_C2426284584665A`
> FOREIGN KEY (`product_id`) REFERENCES `product_module` (`id`))
>
> Adding some debug messages to my DoctrineEventSubscriber and viewing the
> logs I got the following result:
>
> [2014-06-11 21:21:04] doctrine.DEBUG: SELECT t0.id AS id1, t0.message AS
> message2, t0.param1 AS param13, t0.param2 AS param24, t0.module_id AS
> module_id5 FROM module_error t0 WHERE t0.module_id = ? [51] []
> [2014-06-11 21:21:04] doctrine.DEBUG: SELECT t0.text AS text1,
> t0.product_id AS product_id2, t0.placeholder_id AS placeholder_id3 FROM
> template_variable t0 WHERE t0.product_id = ? [51] []
> *[2014-06-11 21:21:04] app.INFO: Deleting module 51 ["doctrine"] []*
> [2014-06-11 21:21:04] doctrine.DEBUG: SELECT t0.id AS id1, t0.message AS
> message2, t0.param1 AS param13, t0.param2 AS param24, t0.module_id AS
> module_id5 FROM module_error t0 WHERE t0.module_id = ? [52] []
> [2014-06-11 21:21:04] doctrine.DEBUG: SELECT t0.text AS text1,
> t0.product_id AS product_id2, t0.placeholder_id AS placeholder_id3 FROM
> template_variable t0 WHERE t0.product_id = ? [52] []
> *[2014-06-11 21:21:04] app.INFO: Deleting module 52 ["doctrine"] []*
> [2014-06-11 21:21:04] doctrine.DEBUG: SELECT t0.id AS id1, t0.message AS
> message2, t0.param1 AS param13, t0.param2 AS param24, t0.module_id AS
> module_id5 FROM module_error t0 WHERE t0.module_id = ? [54] []
> [2014-06-11 21:21:04] doctrine.DEBUG: SELECT t0.id AS id1, t0.name AS
> name2, t0.listed_calendar AS listed_calendar3 FROM calendar t0 WHERE t0.id
> = ? ["42"] []
> [2014-06-11 21:21:04] doctrine.DEBUG: SELECT t0.id AS id1, t0.start_date
> AS start_date2, t0.end_date AS end_date3, t0.name AS name4, t0.overlay AS
> overlay5, t0.calendar_id AS calendar_id6 FROM calendar_event t0 WHERE
> t0.calendar_id = ? ORDER BY t0.start_date ASC [42] []
> *[2014-06-11 21:21:04] app.INFO: Deleting module 54 ["doctrine"] []*
> [2014-06-11 21:21:04] doctrine.DEBUG: SELECT t0.id AS id1, t0.message AS
> message2, t0.param1 AS param13, t0.param2 AS param24, t0.module_id AS
> module_id5 FROM module_error t0 WHERE t0.module_id = ? [53] []
> [2014-06-11 21:21:04] doctrine.DEBUG: SELECT t0.text AS text1,
> t0.product_id AS product_id2, t0.placeholder_id AS placeholder_id3 FROM
> template_variable t0 WHERE t0.product_id = ? [53] []
>
> *[2014-06-11 21:21:04] app.INFO: Deleting module 53 ["doctrine"]
> [][2014-06-11 21:21:04] app.INFO: Deleting product... ["doctrine"] []*
> [2014-06-11 21:21:04] doctrine.DEBUG: "START TRANSACTION" [] []
> [2014-06-11 21:21:04] doctrine.DEBUG: DELETE FROM product_error WHERE id =
> ? [235] []
> [2014-06-11 21:21:04] doctrine.DEBUG: DELETE FROM module_error WHERE id =
> ? [428] []
>
> *[2014-06-11 21:21:04] doctrine.DEBUG: DELETE FROM module WHERE id = ?
> [54] [][2014-06-11 21:21:04] doctrine.DEBUG: DELETE FROM product WHERE id =
> ? [9] []*
> [2014-06-11 21:21:04] doctrine.DEBUG: "ROLLBACK" [] []
>
> The "Deleting module..." and "Deleting product..." log-messages have been
> logged in the preRemove listener.
> This shows that modules 51, 52 and 53 were deleted *before* deletion of
> the product.
>
> But in spite of that just module 54 actually gets deleted before the
> product, resulting in a constraint violation.
> PLEASE HELP ME !
> I don't know where to look for a solution any more.
>
--
You received this message because you are subscribed to the Google Groups
"doctrine-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/doctrine-user.
For more options, visit https://groups.google.com/d/optout.