我的问题很容易理解,这里提到的很多问题都引用了Doctrine文档。
每个具有复合键的实体都不能使用id生成器而非"已转让"。这意味着ID字段必须有其值在调用EntityManager#persistent($entity)之前分配。
我试过了,得到了最后一个生成的ID,在其值上加了+1,并持久化了实体。问题是,使用相同IBMDB2数据库的第三方软件无法添加行,因为当我以这种方式插入行时,自动增量索引不会更新。
有没有办法做到这一点,或者有没有办法更新表的自动递增索引?
提前谢谢。
编辑
为了帮助你更好地理解我想要/必须实现的目标,我将向你展示我的榜样。
EntityClass
class Entity
{
/**
* @ORMId
* @ORMColumn(type="string", name="serie")
*/
protected $serie;
/**
* @ORMId
* @ORMColumn(type="integer", name="reference")
* @ORMGeneratedValue
*/
protected $reference;
// More code...
}
原则允许使用多个主键,但出于某种原因,当我以这种方式填充实体时,
$entity = new Entity();
$entity->set("serie", date('Y')); // Custom setter that search the property and sets the value. In this case, current year as string
// More assignements, except for the autoincrement value
$em->persist($entity);
$em->flush();
它抛出一个异常,说其中一个id没有填充,必须在复合键实体中填充,但它是一个自动递增列,我需要让它以这种方式工作,找到一种方法来获得表的下一个自动增值,或者在IBMDB2中更新表的自动增值。如果没有,如果我获得自动递增列的最大值,将该值增加一并手动分配给实体,则其他第三方软件将崩溃。
查询:
SELECT presence FROM DB2ADMIN.PRESENCES WHERE serie LIKE 2017 ORDER BY presence DESC FETCH FIRST 1 ROWS ONLY;
如果你需要任何进一步的信息,请告诉我。
有两种方法可以做到这一点,但由于您无法访问事务(而且显然不关心间隙),我不推荐其中一种。
我建议您不要使用的第一种方法是创建一个表来保存生成的值,将其递增并返回。我之前曾为SQL Server回答过一个关于此问题,但这个概念应该可以转换。请注意,有些实用程序已经丢失,因为您不能在触发器中生成值,但应该仍然可以工作。剩下的主要问题是,该表代表了一个瓶颈,您无法从中获得太多好处。
第二种方法是每年使用一个单独的SEQUENCE
。这有点问题,因为你需要每年创建一个对象,但得到一个数字会快得多。你也基本上可以保证会有差距。
请注意,我总是有点怀疑主键的值是递增的并且有值的,尤其是在允许间隙的情况下。