【问题标题】:doctrine 2 oracle datetime column showing "not a valid month" on insert entity教义 2 oracle 日期时间列在插入实体上显示“无效月份”
【发布时间】:2013-02-18 06:31:17
【问题描述】:

我正在做一个项目,我们将 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)

请帮帮我。

高级感谢

【问题讨论】:

  • 看起来更像是一个错误而不是一个问题。你试过最新的大师吗?您是否尝试与供应商一起运行测试套件?
  • @Ocramius,是的,我正在使用最新的大师
  • 尝试运行测试套件并最终在 www.doctrine-project.org/jira/ 上报告问题。还要检查您的架构是否与您的映射同步。

标签: doctrine-orm zend-framework2


【解决方案1】:

在这里也发现了这个错误......它没有调用 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/

【讨论】:

  • 请问我有同样的问题,但我不知道我应该在哪里配置,我正在使用 Yii 和 Doctrine 2,请帮助
【解决方案2】:

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 配置here

【讨论】:

    猜你喜欢
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    相关资源
    最近更新 更多