3

我正在做一个项目,我们将 Zend 2 和教义 2 与 oracle 数据库一起使用。我的实体有一个日期时间类型的字段 create_date。我的实体在下面

class Personnel
{

/**
 * @ORM\Column(type="string",unique=true, nullable=false)
 */
protected $login_name;
/**
 * @ORM\Column(type="datetime")
 */
protected $create_date;
public function __construct()
{
    $this->create_date = new \DateTime("now");
}

 public function get_login_name()
{
    return $this->login_name;
}

public function set_login_name($login_name)
{
    $this->login_name = $login_name;
}

}

我保存这个实体

$user = new Personnel();
$user->set_login_name('Admin');
$this->getEntityManager()->persist($user);
$this->getEntityManager()->flush();

但显示错误

    SQLSTATE[HY000]: 一般错误: 1843 OCIStmtExecute: ORA-01843: not a valid month
     (分机\pdo_oci\oci_statement.c:148)

请帮我。

高级谢谢

4

2 回答 2

3

在这里也发现了那个错误......它没有被调用 OracleSessionInit !

但我不知道是缺少配置部分还是教义中的错误,如果您使用 oci8,默认情况下不会启用它

编辑:

刚刚找到它!我应该补充一点,您应该在 service_manager 的调用程序中添加一个指向 \Doctrine\DBAL\Event\Listeners\OracleSessionInit 的服务,所以它应该是这样的:

'invokables' => array(
    'oracle-session-init' => '\Doctrine\DBAL\Event\Listeners\OracleSessionInit'
),

和这个:

'doctrine' => array (
    'driver' => array (
            /** here are your driver settings, such as annotations configs */
    ),
    'eventmanager' => array(
            'orm_default' => array(
                    'subscribers' => array('oracle-session-init')
            )
    )
),

归功于: http ://raymondkolbe.com/2012/06/19/doctrineormmodule-and-oraclesessioninit/

于 2013-05-26T08:48:31.850 回答
0

Doctrine 默认不会调用它,即使您使用 OCI8。在我看来,这不是一个错误,因为您可以直接在 DB 中更改 NLS 参数,因为您不需要每次连接 OracleSessionInit 时都调用它。导致每个会话减少 1 个查询。:)

解决此问题的另一种方法是获取 \Doctrine\ORM\EntityManager 的实例并设置 OracleSessionInit,如下所示。您还可以像我在此示例中所做的那样更改默认会话变量,将具有新值的数组传递给“NLS_SORT”。

Module.php

public function getServiceConfig() {
    return array(
        'initializers' => array(
            function($instance, $services) {
                if ($instance instanceof \Doctrine\ORM\EntityManager) {
                    $instance->getEventManager()->addEventSubscriber(new \Doctrine\DBAL\Event\Listeners\OracleSessionInit(array(
                        'NLS_SORT' => 'WEST_EUROPEAN_AI',
                    )));
                }
            },
        ),
    );
}

Initializer:每次ServiceManager创建一个类的新实例时执行的回调。如果该类实现特定接口,这些通常用于将对象注入到新类实例中。

更多关于初始化器和 Zend\ServiceManager 配置在这里

于 2015-11-21T21:22:04.833 回答