Doctrine 2 - ORM
  1. Doctrine 2 - ORM
  2. DDC-41

Getting error with lazy loading via createQuery() followed by $em->flush()

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Critical Critical
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 2.0-ALPHA3
    • Component/s: ORM
    • Security Level: All
    • Labels:
      None
    • Environment:
      Doctrine2-trunk, Postgresql, Lazy loading

      Description

      Simple O-O relationship between \Entities\User and \Entities\Feed. Seems like there's a problem with not-yet lazy-loaded proxies and $em->flush().

      "Entities/User.php"
      <?php
      namespace Entities;
      
      /** @Entity @Table(name="users_debug") */
      class User {
          /**
           * @Id @Column(type="integer")
           * @GeneratedValue(strategy="AUTO")
           */
          private $id;
      
          /**
           * @OneToOne(targetEntity="Feed", mappedBy="User", cascade={"persist"})
           */
          private $Feed;
      
          public function getID() {
              return $this->id;
          }
          public function getFeed() {
              return $this->Feed;
          }
          public function setFeed($feed) {
              $this->Feed = $feed;
          }
      }
      ?>
      
      "Entities/Feed.php"
      <?php
      namespace Entities;
      
      /**
       * @Entity @Table(name="feeds_debug")
       */
      class Feed {
          /**
           * @Id @Column(type="integer")
           * @GeneratedValue(strategy="AUTO", allocationSize=1)
           */
          private $id;
      
           /**
           * @OneToOne(targetEntity="User", cascade={"persist"})
           * @JoinColumn(name="user_id", referencedColumnName="id")
           */
          private $User;
      
          function setID($value) {
              $this->id = $value;
          }
          function getID() {
              return $this->id;
          }
          function getUser() {
              return $this->User;
          }
          function setUser($user) {
              $this->User = $user;
          }
      }
      
      
      ?>
      

      Table-data

      users_debug:
       id
       361
      
      feeds_debug:
       id  | user_id
       461 |     361
      

      Code:

      $user = $em->createQuery("SELECT u FROM Entities\User u WHERE u.id = 361")->getSingleResult();
      print $user->getID(); // 361
      // uncomment line below and it works
      // print $user->getFeed()->getID();
      $em->flush();
      

      Error:
      Warning: spl_object_hash() expects parameter 1 to be object, null given in /home/crotalus/src/Doctrine2-Dev/lib/Doctrine/ORM/UnitOfWork.php on line 1010
      Warning: spl_object_hash() expects parameter 1 to be object, null given in /home/crotalus/src/Doctrine2-Dev/lib/Doctrine/ORM/UnitOfWork.php on line 566
      Warning: ReflectionProperty::setValue() expects parameter 1 to be object, null given in /home/crotalus/src/Doctrine2-Dev/lib/Doctrine/ORM/UnitOfWork.php on line 575
      Warning: get_class() expects parameter 1 to be object, null given in /home/crotalus/src/Doctrine2-Dev/lib/Doctrine/ORM/UnitOfWork.php on line 979
      Fatal error: Uncaught exception 'ReflectionException' with message 'Class does not exist' in /home/crotalus/src/Doctrine2-Dev/lib/Doctrine/ORM/Mapping/ClassMetadata.php:69
      Stack trace:
      #0 /home/crotalus/src/Doctrine2-Dev/lib/Doctrine/ORM/Mapping/ClassMetadata.php(69): ReflectionClass->__construct(false)
      #1 /home/crotalus/src/Doctrine2-Dev/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php(247): Doctrine\ORM\Mapping\ClassMetadata->__construct(false)
      #2 /home/crotalus/src/Doctrine2-Dev/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php(177): Doctrine\ORM\Mapping\ClassMetadataFactory->_newClassMetadataInstance(false)
      #3 /home/crotalus/src/Doctrine2-Dev/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php(115): Doctrine\ORM\Mapping\ClassMetadataFactory->_loadMetadata(false)
      #4 /home/crotalus/src/Doctrine2-Dev/lib/Doctrine/ORM/EntityManager.php(212): Doctrine\ORM\Mapping\ClassMetadataFactory->getMetadataFor(false)
      #5 /home/crotalus/src/Doctrine2-Dev/lib/Doctrine/ORM/UnitOfWork.php(979): Doctrine\ORM\EntityManager->getClassMetadata in /home/crotalus/src/Doctrine2-Dev/lib/Doctrine/ORM/Mapping/ClassMetadata.php on line 69

      PostgreSQL log:
      2009-10-10 16:32:58 CEST LOGG: execute pdo_stmt_000000000a283af8: SELECT u0_.id AS id0 FROM users_debug u0_ WHERE u0_.id = 361
      2009-10-10 16:32:58 CEST LOGG: sats: DEALLOCATE pdo_stmt_000000000a283af8
      2009-10-10 16:32:58 CEST LOGG: execute pdo_stmt_000000000a283af8: SELECT NEXTVAL('feeds_debug_id_seq')
      2009-10-10 16:32:58 CEST LOGG: sats: DEALLOCATE pdo_stmt_000000000a283af8
      2009-10-10 16:32:58 CEST LOGG: execute pdo_stmt_000000000a283af8: SELECT NEXTVAL('users_debug_id_seq')
      2009-10-10 16:32:58 CEST LOGG: sats: DEALLOCATE pdo_stmt_000000000a283af8

        Activity

        Hide
        Roman S. Borschel added a comment -

        Strange, all the warnings and errors and the stack trace rather indicate that the associated value is NULL and not a (not initialized) proxy object. I'm working on this and already found an issue to address but I'm still unable to exactly reproduce this. Will keep you updated. If you have any further information, please let me know.

        Show
        Roman S. Borschel added a comment - Strange, all the warnings and errors and the stack trace rather indicate that the associated value is NULL and not a (not initialized) proxy object. I'm working on this and already found an issue to address but I'm still unable to exactly reproduce this. Will keep you updated. If you have any further information, please let me know.
        Hide
        Roman S. Borschel added a comment -

        OK, managed to reproduce this. Working on it.

        Show
        Roman S. Borschel added a comment - OK, managed to reproduce this. Working on it.
        Hide
        Roman S. Borschel added a comment -

        This should now be fixed but you need to manually delete your proxy classes so that they're regenerated. More improvements to the proxy classes and CLI tasks for (re)generating proxy classes will follow.

        Show
        Roman S. Borschel added a comment - This should now be fixed but you need to manually delete your proxy classes so that they're regenerated. More improvements to the proxy classes and CLI tasks for (re)generating proxy classes will follow.

          People

          • Assignee:
            Roman S. Borschel
            Reporter:
            Nichlas Löfdahl
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: