我需要将当前记录的用户名传递给数据库连接,因为我想跟踪用户更改并使用正确的用户名将其存储在 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...
}
问题:
问题是我不知道如何/在哪里调用它以将一些值传递给连接。我的意思是我应该在什么时候注入这段代码,因为我使用的是休眠和 EntityManagerFactory 并且我没有手动创建连接,所以我无权访问连接对象本身。我只需要为整个用户连接调用一次,并在连接释放后删除用户名。
预期目标:
我的目标是将字符串(实际用户名)从 java 代码或休眠配置传递到表中“client_info”列下的 Oracle DB v$session
,就在由休眠完成的连接建立之后/期间。
我知道这个值可以通过DBMS_APPLICATION_INFO.SET_CLIENT_INFO()
过程传递,我什至用下面的代码检查了它,但主要问题是如何在休眠连接建立时只调用一次整个连接?
将值传递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>
持久性.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>
是否可以通过休眠配置或通过 Java 代码来实现?
请帮我解决这个问题..