如何在Hibernate建立连接期间将用户名传递给数据库连接?

时间:2013-03-19 15:45:27

标签: oracle hibernate spring-mvc jboss

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

请帮我解决这个问题..

0 个答案:

没有答案