Doctrine orm 原则2首先刷新错误的实体

Doctrine orm 原则2首先刷新错误的实体,doctrine-orm,Doctrine Orm,我有这种数据库设计,在某些情况下,条令2会按照插入顺序做出正确的决策,有时则不会 我有一个自动导入过程,在数据提供者更改数据时导入和更新数据。字段item.something\u ocated\u item\u history\u id是导致问题的新字段 开始导入时 第一步。数据库中没有数据,我创建了一个项和一个项的历史记录,其中项的历史记录。项的id是项的id,项的id是项的id。发生了什么事项的历史记录id为空。现在我做了刷新,Doctrine可以计算出它需要在item_历史之前插入ite

我有这种数据库设计,在某些情况下,条令2会按照插入顺序做出正确的决策,有时则不会

我有一个自动导入过程,在数据提供者更改数据时导入和更新数据。字段item.something\u ocated\u item\u history\u id是导致问题的新字段

开始导入时

第一步。数据库中没有数据,我创建了一个项和一个项的历史记录,其中项的历史记录。项的id是项的id,项的id是项的id。发生了什么事项的历史记录id为空。现在我做了刷新,Doctrine可以计算出它需要在item_历史之前插入item。一切都很好

第二步。现在一个新的导入进来了,并且步骤1中的一些数据已经存在于数据库中。但在新的导入中,我实际上有一个新的独特项。因此,我要做的是创建项和项_历史记录,与步骤1完全相同。但由于某些原因,在冲水期间,条令认为项目历史需要在项目之前保存。无法执行此操作,因为项_历史记录上的外键引用不可为空

我知道条令是根据外键参考做出决定的,而字段“发生了什么事”\u项目\u历史\u id造成了麻烦。但是在第一步中它不会引起任何问题。当数据库中已经有一些数据加载到entityManager中时,就会出现问题

我还没有弄明白如何操纵条令2,以便它总是在条目历史之前保存条目

有什么办法解决吗

因为我真的不想改变我的数据库设计,因为条令2无法确定插入顺序

此外,也不能选择进行更多的刷新,因为在数据进入数据库之前要进行大量的数据验证。我不希望数据库中有任何损坏的数据

致以最良好的祝愿, 亨德里克

编辑:原则2映射

/**
 * @Table(name="item", uniqueConstraints={@UniqueConstraint(name="uc_something_happened_item_history", columns={"something_happened_item_history_id"})})
 **/
class Item
{
    /** @Id @Column(name="id", type="integer", options={"unsigned":true}) @GeneratedValue **/
    protected $id;

    /**
     * @OneToMany(targetEntity="ItemHistory", mappedBy="item")
     **/
    protected $itemHistories;


    /**
     * @OneToOne(targetEntity="ItemHistory")
     * @JoinColumn(name="something_happened_item_history_id", referencedColumnName="id", nullable=true, unique=true)
     **/
    protected $somethingHappenedItemHistory;
}

/**
 * @Table(name="item_history")
 **/
class ItemHistory
{
    /** @Id @Column(name="id", type="integer", options={"unsigned":true}) @GeneratedValue **/
    protected $id;

    /**
     * @ManyToOne(targetEntity="Item", inversedBy="itemHistories")
     * @JoinColumn(name="item_id", referencedColumnName="id", nullable=false)
     **/
    protected $item;
}

我没有按我想要的方式解决这个问题

但是,通过使项目_id为空,那么条令就能够完成刷新。
数据库中的数据也是正确的。

您确定步骤2中新项目的代码与步骤1完全相同吗?听起来好像$item->setHistory($history)从未被调用,因此对象没有交叉链接。信条真的不应该有1:1双向关系的问题,只要每个对象指向另一个。好的,我现在看到问题了。此处回顾:您需要声明一方为拥有方。所以现在我有点怀疑你的第一步是否有效。嗨,塞拉德,谢谢你的回复。我已经把条令2的地图附在了主帖子上。我把课堂上所有其他的噪音都消除了。希望它能帮助你看到一些我看不到的东西。我看不出我应该做些什么来让一方更具主人翁精神。他们只是在相互参照。甚至,如果代码做了其他事情,那么条令应该能够在ItemHistory之前确定该项需要进入数据库。特别是,因为在刷新期间,$somethingHappenedItemHistory是空的。我承认我的uml阅读技能不是他们应该具备的。我不知道你有两个亲戚。仍然没有任何意义,仅仅添加“发生了什么事”关系只会在数据库已经有数据时导致失败。这可能是唯一的约束。你在使用什么数据库?mysql在检查唯一约束时忽略空值。但大多数数据库没有。甚至可以尝试删除约束。我正在使用MySql。但由于问题发生在原则插入顺序中,因此我怀疑错误与MySql有关。删除约束会起作用,但这是我解决问题的最后一个选项:)。