2

我需要将当前记录的用户名传递给数据库连接,因为我想跟踪用户更改并使用正确的用户名将其存储在 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 代码来实现?

请帮我解决这个问题..

4

0 回答 0