Zend + Doctrine2:如何使用ArrayCollections正确刷新实体?

如何解决Zend + Doctrine2:如何使用ArrayCollections正确刷新实体?

| 我正在启动我的第一个Zend Framework + Doctrine 2项目,但我有一个问题。我使用PostgreSQL 9和Apache 2.2 我有以下实体(实体和属性的名称仅用于此示例):
<?php
namespace Xproject\\Entities;
/**
 * Entity1   
 * @Table()  
 * @Entity  
 */      
class Entity1
{  
/***  
 * @var integer $ent1Code     
 * @Column(name=\"ent1Code\",type=\"integer\",length=4)  
 * @Id  
 * @GeneratedValue(strategy=\"IDENTITY\")  
 */  
private $ent1Code;

/**
 * @var decimal $att1     
 * @Column(name=\"att1\",type=\"decimal\")
 */
private $att1;

 /** 
 * OWNING SIDE
 * @var \\Doctrine\\Common\\Collections\\ArrayCollection     
 * @ManyToOne(targetEntity=\"Entity2\",inversedBy=\"entity1\")
 * @JoinColumn(name=\"ent2Code\",referencedColumnName=\"ent2Code\")
 */
private $entity2;

/** 
 * UNIDIRECTIONAL
 * @var \\Doctrine\\Common\\Collections\\ArrayCollection
 * @ManyToOne(targetEntity=\"Entity3\")
 * @JoinColumn(name=\"ent3Code\",referencedColumnName=\"ent3Code\")
 */
private $entity3;

 /**
 * UNIDIRECTIONAL
 * @var \\Doctrine\\Common\\Collections\\ArrayCollection
 * @ManyToOne(targetEntity=\"Entity4\")
 * @JoinColumn(name=\"ent4Code\",referencedColumnName=\"ent4Code\")
 */
private $entity4;

public function __construct() {
    $this->entity2 = new \\Doctrine\\Common\\Collections\\ArrayCollection();
    $this->entity3 = new \\Doctrine\\Common\\Collections\\ArrayCollection();
    $this->entity4 = new \\Doctrine\\Common\\Collections\\ArrayCollection();
}

public function getEnt1Code(){
    return $this->ent1Code;
}

public function getAtt1(){
    return $this->att1;
}

public function setAtt1($value){
    $this->att1=$value;
}

public function addEntity2(Entity2 $value){
    $value->addEntity1($this);
    $this->entity2->add($value);
}

public function addEntity3(Entity3 $value){
    $this->entity3->add($value);
}

public function addEntity4(Entity4 $value){
    $this->entity4->add($value);
  }  
}

<?php
namespace Xproject\\Entities;
/**
 * Entity2 
 * @Table()
 * @Entity
 */
class Entity2
 {
/**
 * @var integer $ent2Code     
 * @Column(name=\"ent2Code\",length=4)
 * @Id
 * @GeneratedValue(strategy=\"IDENTITY\")
 */
private $ent2Code;

/**
 * INVERSE SIDE
 * @var entity1    
 * @OneToMany(targetEntity=\"Entity1\",mappedBy=\"entity2\")
 */
private $entity1;

public function __construct() {
    $this->entity1 = new \\Doctrine\\Common\\Collections\\ArrayCollection();
}

public function getEnt2Code(){
    return $this->ent2Code;
}

public function addEntity1(Entity1 $value){
    $this->entity1->add($value);
}
}

<?php
namespace Xproject\\Entities;

/**
 * Entity3
 * @Table()
 * @Entity
 */
class Entity3
{
/**
 * @var integer $ent3Code     
 * @Column(name=\"ent3Code\",length=4)
 * @Id
 * @GeneratedValue(strategy=\"IDENTITY\")
 */
private $ent3Code;

/**
 * @var string $att1     
 * @Column(name=\"att1\",type=\"string\",length=150)
 */
private $att1;

public function getEnt3Code(){
    return $this->ent3Code;
}

public function getAtt1(){
    return $this->att1;
}

public function setAtt1($value){
    $this->att1=$value;
}

}

<?php   
namespace Xproject\\Entities;
/**
 * Entity4 
 * @Table()
 * @Entity
 */
 class Entity4 
{
/**
 * @var integer $ent4Code   
 * @Column(name=\"ent4Code\",length=4)
 * @Id
 * @GeneratedValue(strategy=\"IDENTITY\")
 */
private $ent4Code;

/**
 * @var string $att1    
 * @Column(name=\"att1\",length=150)
 */
private $att1;

public function getEnt4Code(){
    return $this->ent4Code;
}

public function getAtt1(){
    return $this->att1;
}

public function setAtt1($value){
    $this->att1=$value;
}
}
为了尝试一切正常,我在Xproject的indexController中使用以下代码:
<?php
class IndexController extends Zend_Controller_Action
{
    public function init()
   {
        $this->doctrine = Zend_Registry::get(\'doctrine\');
        $this->em = $this->doctrine->getEntityManager();
    }

public function indexAction()
{
    $ent2 = new Xproject\\Entities\\Entity2();
    $this->em->persist($ent2);

    $ent3 = new Xproject\\Entities\\Entity3();
    $ent3->setAtt1(\'xyz\');
    $this->em->persist($ent3);

    $ent4= new Xproject\\Entities\\Entity4();
    $ent4->setAtt1(\'abc\');
    $this->em->persist($ent4);

    //1st flush
    $this->em->flush();                       

    $ent1= new Xproject\\Entities\\Entity1();
    $ent1->setAtt1(350.00);
    $ent1->addEntity2(ent2);
    $ent1->addEntity3(ent3);
    $ent1->addEntity4(ent4);
    $this->em->persist($ent1);

    //2nd flush
    //$this->em->flush();     
}
}
第一次刷新工作正常,一切都保存到数据库中,但是,如果我同时使用第二次和第二次刷新,浏览器将指示应用程序错误,并且$ ent1根本不会保存到数据库中。 使用var_dump($ ent1),我可以看到对象$ ent1的状态是正确的(att1并且所有集合都已加载好)。 加载此脚本期间,Apache错误日志不显示任何错误或警告。 我绝对认为我在这里缺少一些与ArrayCollections有关的重要信息,以及在刷新它们时它们如何工作。 我是否缺少一些重要的东西?     

解决方法

您的关系都是ManyToOne,因此不应该涉及ArrayCollections。 由于没有收藏,所以您不想
add
的东西,而您想要
set
的东西: 在Entity1中:
public function setEntity2(Entity2 $entity2){
    $this->entity2 = $entity2
    return $this;
}
在您的控制器中:
$entity1->setEntity2($entity2);
就是这样。像$ this-> entity2-> add()之类的调用正在工作,因为您正在将这些属性初始化为ArrayCollections。但是学说只是无视它们。 换句话说,对于* ToOne关系,对象属性只是外部实体类型。将它们视为简单值,然后通过典型的set *()突变器进行设置。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-