Java 未在应用程序的数据库列中设置默认值

Java 未在应用程序的数据库列中设置默认值,java,database,oracle,jdbc,websphere,Java,Database,Oracle,Jdbc,Websphere,我有一个在websphere中运行的应用程序。我已经在服务器上配置了数据源,并从jndi获取了数据源。 我使用的是SpringJDBC,有几个select语句运行得很好 现在,我有一个insert语句,它正在“toad”内部成功运行,但同一个insert语句在应用程序中失败 java.sql.SQLException: ORA-01400: cannot insert NULL into ("SCHEMA1"."XYZ"."CREATED_BY") CREATED_BY is a VARCHA

我有一个在websphere中运行的应用程序。我已经在服务器上配置了数据源,并从jndi获取了数据源。 我使用的是SpringJDBC,有几个select语句运行得很好

现在,我有一个insert语句,它正在“toad”内部成功运行,但同一个insert语句在应用程序中失败

java.sql.SQLException: ORA-01400: cannot insert NULL into ("SCHEMA1"."XYZ"."CREATED_BY")

CREATED_BY is a VARCHAR2 (30 Byte) with DEFAULT set to 'SYS_CONTEXT ('USERENV', 'OS_USER')'
注意:我没有在insert语句中指定列。我的发言如下:

<beans:bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <beans:property name="jndiName" value="jdbc/MyDatasource" />
</beans:bean>
我正在使用jdbcTemplate,因此基本上是这样做的:

jdbcTemplate.update(theQuery);
我正在按如下方式配置数据源:

<beans:bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <beans:property name="jndiName" value="jdbc/MyDatasource" />
</beans:bean>
现在我希望这是来自为数据源设置JAAS-J2C身份验证数据时使用的用户名

我不想指定每个查询都可以轻松自动填充的所有审核列。任何帮助都将不胜感激。

来自

命名空间USERENV的预定义参数 OS_用户操作系统启动数据库会话的客户端进程的用户名

还有

CLIENT_IDENTIFIER返回应用程序通过DBMS_SESSION.set_IDENTIFIER过程、OCI属性OCI_ATTR_CLIENT_IDENTIFIER或Java类Oracle.jdbc.OracleConnection.setClientIdentifier设置的标识符。各种数据库组件使用此属性来标识身份验证为同一数据库用户的轻量级应用程序用户

会话\用于验证当前用户的用户数据库用户名。该值在整个会话期间保持不变


我不熟悉Oracle身份验证,但后者可能更适合您的任务。

如果您希望使用默认值,则不能将列指定为INSERT语句的一部分,也不能在VALUES部分指定关键字default。这正是我要做的。它在toad内部工作,但不在web应用程序中工作。然后向我们展示应用程序的功能,例如SQL语句、Java代码……更新了更多信息。但我坚信这与“SYS_CONTEXT”在我使用toad时设置了“OS_USER”这一事实有关,而不是当查询来自应用程序时。为什么,我不知道,如何正确地做可能会回答这个问题。这正是我正在做的。它在蟾蜍体内工作,但在应用程序中不起作用。非常感谢!明亮的SESSION_USER是应该首先使用的。另外,我还发现OS_用户为空的原因是ojdbc14.jar版本10.2.0.1.0和其他一些版本中的Oracle错误3735857。Bug表示症状:当使用瘦JDBC驱动程序10.2.0.1时,V$SESSION中的OSUSER列为null。和解决方案一样,将补丁4677125应用于10.2.0.1.0 JDBC驱动程序。-来源-