我面临的问题是,我不能强迫教义为新对象发布新的ID。例如:
/**
* Something
*
* @ORMTable(name="something")
* @ORMEntity
*/
class Something
{
/**
* @var integer
*
* @ORMColumn(name="id", type="integer", nullable=false)
* @ORMId
* @ORMGeneratedValue(strategy="IDENTITY")
*/
protected $id;
}
显然会生成唯一的 ID - 但是当对象稍后被删除时,该 ID 将用于以后生成的对象。这是不幸的,因为可能存在引用该id的链接,这些链接现在指向错误的对象,而不仅仅是失败。
当直接在数据库上没有原则的情况下工作时,我正在使用autoincrement
并且它按预期工作。然而,使用学说来管理表格似乎行不通。
使用 strategy="UUID"
很有帮助,而且通常是更好的选择,但有时这是不可行的。例如,捆绑包 FOSUserBundle 似乎依赖于用户 id 的整数。这基本上意味着 a) 永远不要删除用户,而只是停用它们,或者 b) 向其添加另一个 id/密钥(对于依赖该人工 ID 的关系来说非常笨拙)。
是否可以强制使用新的整数 ID?(让FOSBundle使用UUID
的方法会很好,但我认为这是无法实现的。
目前在OS X上的symfony 3.1.2中使用sqlite的2.5.4原则 - 但生产服务器将基于Linux。在 PHP 7.0 上运行。
根据 Doctrine 文档将GeneratedValue(strategy="IDENTITY")
映射到 sqlite 数据库上的AUTOINCREMENT
,因此没有 Doctrine 的尝试应该没有区别。
事实上,具有AUTOINCREMENT
的标识列只有在生成生成的数字的事务被回滚时,才应重用生成的数字(请参阅 https://sqlite.org/autoinc.html)。在这种情况下,不应在其他条目中使用该数字,因为它们也应回滚。
所以我认为使用GeneratedValue(strategy="IDENTITY")
没有问题,至少如果你使用事务。
编辑
Doctrine2 中存在一个错误,该错误阻止GeneratedValue(strategy="IDENTITY")
正常工作,但存在一种解决方法,该解决方法为onSchemaCreateTable
事件注册EventSubscriber
。它创建正确的 sql 以生成主键列上具有AUTOINCREMENT
属性的表。