2011-06-13 110 views
1

我试图在Doctrine 2中映射2个MySQL表之间的关系。我拥有的实体是'Campaign',它加入到'Channel'中。在Doctrine 2中持久化映射关系中的选定实体

保存活动记录时,必须包含通道ID。检索广告系列时,我想使用此ID加入频道并显示频道名称(从频道表中)。我相信这是一种一对一的单向关系,如果我错了,请纠正我。

table relationship

我指定使用Doctrine 2 XML映射如下:

<one-to-one field="channelId" target-entity="Channel" fetch="EAGER"> 
     <join-column name="channel_id" referenced-column-name="id" /> 
    </one-to-one> 

当填充市场活动实体,并试图坚持它,我收到以下错误。的mvc \实体\频道@ 0000000034b3dcd500000000cc77faae:

一个新的实体通过中没有配置级联坚持操作的关系,结果发现。显式持久化新实体或在关系上配置级联持久操作。

应该如何坚持这种指定,我不希望修改或保存通道实体。我研究了关于“关联映射”的Doctrine 2文档,但我无法理解这是如何实现的。

谢谢。

回答

1

找到有人遇到类似问题here。问题在于Campaign XML映射到Channels表(channel_id和channel_name)中有2个引用。只有channel_id是必需的,并且必须先创建通道实体并将其分配给活动实体,然后才能保持活动实体。

奇怪的是,我不需要分开明确地坚持Channel实体。我的竞选XML映射看起来是这样的:

<one-to-one field="channelId" target-entity="ToastChannels" fetch="EAGER"> 
<join-column name="channel_id" referenced-column-name="id" /> 
</one-to-one> 

的分配是这样的:

$channelEntity = $this->_channelsDao->disableCache()->findObject($channelId]); 
    $campaignEntity->setChannel($channelEntity); 
    return $this->_campaignDao->save($campaignEntity); 

在DB水平,预期只有频道ID被存储到活动表。由于没有规定持久性规则,所以我仍然不确定这是可能的。

2

当你坚持一个对象时,你需要确保所有关联的对象也被持久化。在这种情况下,您正在创建一个Campaign并将其与频道关联。如果Channel对象尚未保存,则需要在调用flush之前执行此操作,或者在关系中使用持续级联。以下是您的两个选项:

1)在您的代码中,当您坚持Campaign时,也明确坚持Channel。

$em->perist($campaign); 
$em->persist($campaign->getChannel()); 

2)在Campaign :: channel上放置一个持续级联。这会在Channel对象与Campaign关联时自动保留。我不知道XML中的确切语法,但试试

<one-to-one field="channelId" target-entity="Channel" fetch="EAGER"> 
    <join-column name="channel_id" referenced-column-name="id" /> 
    <cascade><cascade-persist /></cascade> 
</one-to-one> 
相关问题