我需要将当前记录的用户名传递给数据库连接,因为我想跟踪用户更改并将其存储在具有正确用户名的Oracle DB中。我在JBoss 5.1和Oracle 11g数据库上使用Hibernate。
我想我需要做这样的事情(SOURCE):
try {
String e2eMetrics[] = new String[OracleConnection.END_TO_END_STATE_INDEX_MAX];
e2eMetrics[OracleConnection.END_TO_END_CLIENTID_INDEX] = System.getProperty("user.name");
((OracleConnection) conn).setEndToEndMetrics(e2eMetrics, (short) 0);
} catch (SQLException sqle) {
// Do something...
}
问题在于我不知道如何/在何处调用它以将某些值传递给连接。我的意思是,在哪一刻,我应该注入这个代码,因为我使用的是hibernate和EntityManagerFactory而且我没有手动创建连接,所以我无法访问连接对象本身。我只需要为整个用户连接调用一次,并在连接释放后删除用户名。
我的目标是在v$session
表中的'client_info'列下将字符串(实际用户名)从java代码或hibernate配置传递到Oracle DB,就在连接建立之后/期间由hibernate完成。
我知道这个值可以通过DBMS_APPLICATION_INFO.SET_CLIENT_INFO()
过程传递,我甚至用下面的代码检查它,但主要的问题是如何在hibernate中建立连接时对整个连接只调用一次?
将值传递到v$session
表到'client_info'列的工作测试:
@Override
@Transactional
public void setDBClientInfo(String clientInfo) {
try {
Query query = em.createNativeQuery("{call SYS.dbms_application_info.set_client_info(:userName)}")
.setParameter("userName", clientInfo);
query.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}
}
弹簧servlet.xml中:
<!-- DataSource -->
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/MynameDS" expected-type="javax.sql.DataSource" />
<!-- EntityManagerFactory -->
<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="persistenceXmlLocation" value="classpath:persistence.xml"/>
<property name="persistenceProviderClass" value="org.hibernate.ejb.HibernatePersistence"/>
<property name="jpaDialect">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
</property>
</bean>
<!-- TransactionManager -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="emf"/>
</bean>
的persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="MyUnitName" transaction-type="RESOURCE_LOCAL">
<non-jta-data-source>jdbc/MyNameDS</non-jta-data-source>
<class>com.mydomain.model.Assignment</class>
<class>com.mydomain.model.AuditLog</class>
<class>com.mydomain.model.Person</class>
<class>com.mydomain.model.Trial</class>
<class>com.mydomain.model.Violation</class>
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider"/>
<property name="hibernate.validator.apply_to_ddl" value="false"/>
<property name="hibernate.validator.autoregister_listeners" value="false"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
是否可以通过hibernate配置或通过Java代码进行?
请帮我解决这个问题..