123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- # Update from 2.0-BETA3 to 2.0-BETA4
-
- ## XML Driver <change-tracking-policy /> element demoted to attribute
-
- We changed how the XML Driver allows to define the change-tracking-policy. The working case is now:
-
- <entity change-tracking-policy="DEFERRED_IMPLICT" />
-
- # Update from 2.0-BETA2 to 2.0-BETA3
-
- ## Serialization of Uninitialized Proxies
-
- As of Beta3 you can now serialize uninitialized proxies, an exception will only be thrown when
- trying to access methods on the unserialized proxy as long as it has not been re-attached to the
- EntityManager using `EntityManager#merge()`. See this example:
-
- $proxy = $em->getReference('User', 1);
-
- $serializedProxy = serialize($proxy);
- $detachedProxy = unserialized($serializedProxy);
-
- echo $em->contains($detachedProxy); // FALSE
-
- try {
- $detachedProxy->getId(); // uninitialized detached proxy
- } catch(Exception $e) {
-
- }
- $attachedProxy = $em->merge($detachedProxy);
- echo $attackedProxy->getId(); // works!
-
- ## Changed SQL implementation of Postgres and Oracle DateTime types
-
- The DBAL Type "datetime" included the Timezone Offset in both Postgres and Oracle. As of this version they are now
- generated without Timezone (TIMESTAMP WITHOUT TIME ZONE instead of TIMESTAMP WITH TIME ZONE).
- See [this comment to Ticket DBAL-22](http://www.doctrine-project.org/jira/browse/DBAL-22?focusedCommentId=13396&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#action_13396)
- for more details as well as migration issues for PostgreSQL and Oracle.
-
- Both Postgres and Oracle will throw Exceptions during hydration of Objects with "DateTime" fields unless migration steps are taken!
-
- ## Removed multi-dot/deep-path expressions in DQL
-
- The support for implicit joins in DQL through the multi-dot/Deep Path Expressions
- was dropped. For example:
-
- SELECT u FROM User u WHERE u.group.name = ?1
-
- See the "u.group.id" here is using multi dots (deep expression) to walk
- through the graph of objects and properties. Internally the DQL parser
- would rewrite these queries to:
-
- SELECT u FROM User u JOIN u.group g WHERE g.name = ?1
-
- This explicit notation will be the only supported notation as of now. The internal
- handling of multi-dots in the DQL Parser was very complex, error prone in edge cases
- and required special treatment for several features we added. Additionally
- it had edge cases that could not be solved without making the DQL Parser
- even much more complex. For this reason we will drop the support for the
- deep path expressions to increase maintainability and overall performance
- of the DQL parsing process. This will benefit any DQL query being parsed,
- even those not using deep path expressions.
-
- Note that the generated SQL of both notations is exactly the same! You
- don't loose anything through this.
-
- ## Default Allocation Size for Sequences
-
- The default allocation size for sequences has been changed from 10 to 1. This step was made
- to not cause confusion with users and also because it is partly some kind of premature optimization.
-
- # Update from 2.0-BETA1 to 2.0-BETA2
-
- There are no backwards incompatible changes in this release.
-
- # Upgrade from 2.0-ALPHA4 to 2.0-BETA1
-
- ## EntityRepository deprecates access to protected variables
-
- Instead of accessing protected variables for the EntityManager in
- a custom EntityRepository it is now required to use the getter methods
- for all the three instance variables:
-
- * `$this->_em` now accessible through `$this->getEntityManager()`
- * `$this->_class` now accessible through `$this->getClassMetadata()`
- * `$this->_entityName` now accessible through `$this->getEntityName()`
-
- Important: For Beta 2 the protected visibility of these three properties will be
- changed to private!
-
- ## Console migrated to Symfony Console
-
- The Doctrine CLI has been replaced by Symfony Console Configuration
-
- Instead of having to specify:
-
- [php]
- $cliConfig = new CliConfiguration();
- $cliConfig->setAttribute('em', $entityManager);
-
- You now have to configure the script like:
-
- [php]
- $helperSet = new \Symfony\Components\Console\Helper\HelperSet(array(
- 'db' => new \Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper($em->getConnection()),
- 'em' => new \Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper($em)
- ));
-
- ## Console: No need for Mapping Paths anymore
-
- In previous versions you had to specify the --from and --from-path options
- to show where your mapping paths are from the console. However this information
- is already known from the Mapping Driver configuration, so the requirement
- for this options were dropped.
-
- Instead for each console command all the entities are loaded and to
- restrict the operation to one or more sub-groups you can use the --filter flag.
-
- ## AnnotationDriver is not a default mapping driver anymore
-
- In conjunction with the recent changes to Console we realized that the
- annotations driver being a default metadata driver lead to lots of glue
- code in the console components to detect where entities lie and how to load
- them for batch updates like SchemaTool and other commands. However the
- annotations driver being a default driver does not really help that much
- anyways.
-
- Therefore we decided to break backwards compability in this issue and drop
- the support for Annotations as Default Driver and require our users to
- specify the driver explicitly (which allows us to ask for the path to all
- entities).
-
- If you are using the annotations metadata driver as default driver, you
- have to add the following lines to your bootstrap code:
-
- $driverImpl = $config->newDefaultAnnotationDriver(array(__DIR__."/Entities"));
- $config->setMetadataDriverImpl($driverImpl);
-
- You have to specify the path to your entities as either string of a single
- path or array of multiple paths
- to your entities. This information will be used by all console commands to
- access all entities.
-
- Xml and Yaml Drivers work as before!
-
-
- ## New inversedBy attribute
-
- It is now *mandatory* that the owning side of a bidirectional association specifies the
- 'inversedBy' attribute that points to the name of the field on the inverse side that completes
- the association. Example:
-
- [php]
- // BEFORE (ALPHA4 AND EARLIER)
- class User
- {
- //...
- /** @OneToOne(targetEntity="Address", mappedBy="user") */
- private $address;
- //...
- }
- class Address
- {
- //...
- /** @OneToOne(targetEntity="User") */
- private $user;
- //...
- }
-
- // SINCE BETA1
- // User class DOES NOT CHANGE
- class Address
- {
- //...
- /** @OneToOne(targetEntity="User", inversedBy="address") */
- private $user;
- //...
- }
-
- Thus, the inversedBy attribute is the counterpart to the mappedBy attribute. This change
- was necessary to enable some simplifications and further performance improvements. We
- apologize for the inconvenience.
-
- ## Default Property for Field Mappings
-
- The "default" option for database column defaults has been removed. If desired, database column defaults can
- be implemented by using the columnDefinition attribute of the @Column annotation (or the approriate XML and YAML equivalents).
- Prefer PHP default values, if possible.
-
- ## Selecting Partial Objects
-
- Querying for partial objects now has a new syntax. The old syntax to query for partial objects
- now has a different meaning. This is best illustrated by an example. If you previously
- had a DQL query like this:
-
- [sql]
- SELECT u.id, u.name FROM User u
-
- Since BETA1, simple state field path expressions in the select clause are used to select
- object fields as plain scalar values (something that was not possible before).
- To achieve the same result as previously (that is, a partial object with only id and name populated)
- you need to use the following, explicit syntax:
-
- [sql]
- SELECT PARTIAL u.{id,name} FROM User u
-
- ## XML Mapping Driver
-
- The 'inheritance-type' attribute changed to take last bit of ClassMetadata constant names, i.e.
- NONE, SINGLE_TABLE, INHERITANCE_TYPE_JOINED
-
- ## YAML Mapping Driver
-
- The way to specify lifecycle callbacks in YAML Mapping driver was changed to allow for multiple callbacks
- per event. The Old syntax ways:
-
- [yaml]
- lifecycleCallbacks:
- doStuffOnPrePersist: prePersist
- doStuffOnPostPersist: postPersist
-
- The new syntax is:
-
- [yaml]
- lifecycleCallbacks:
- prePersist: [ doStuffOnPrePersist, doOtherStuffOnPrePersistToo ]
- postPersist: [ doStuffOnPostPersist ]
-
- ## PreUpdate Event Listeners
-
- Event Listeners listening to the 'preUpdate' event can only affect the primitive values of entity changesets
- by using the API on the `PreUpdateEventArgs` instance passed to the preUpdate listener method. Any changes
- to the state of the entitys properties won't affect the database UPDATE statement anymore. This gives drastic
- performance benefits for the preUpdate event.
-
- ## Collection API
-
- The Collection interface in the Common package has been updated with some missing methods
- that were present only on the default implementation, ArrayCollection. Custom collection
- implementations need to be updated to adhere to the updated interface.
-
|