【问题标题】:Two Namingstrategies for one SessionFactory in SpringSpring中一个SessionFactory的两种命名策略
【发布时间】:2010-11-16 13:50:05
【问题描述】:

我正在使用休眠 3.5 和 Spring 3.0.4。

我有一些旧表和一些需要不同 NamingStrategies 的新表。我在 spring 中用命名策略声明了一个 sessionFactory;

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="energyDataSource" />
<property name="hibernateProperties">
  <value>
      hibernate.show_sql=true
      hibernate.dialect=org.hibernate.dialect.MySQLDialect
  </value>
</property>
<property name="namingStrategy" ref="namingStrategy"/>
<property name="annotatedClasses">
  <list>
    <!-- user stuff -->
    <value>user.model.UserAccount</value>
 <!--  energy   -->
    <value>com.energy.domain.Selskapstype</value>
 </list>
</property>

我希望命名策略适用于 UserAccount,但不适用于 Selskapstype。有没有办法做到这一点?使用注释还是xml?

【问题讨论】:

    标签: hibernate spring annotations


    【解决方案1】:

    当然,只需编写您自己的 NamingStrategy 实现,它会根据表名委托给其他几种策略之一,然后将该自定义策略插入您的 SessionFactory

    【讨论】:

    • 哇 - 快速回答!我试图制作自己的 NamingStrategy 来覆盖 @Override public String tableName(String tableName) { return tableName;并且有效.. 但是我需要对 columnname 做同样的事情。那是很多列。所以我一直在寻找更简单的出路。 (抱歉此评论的格式)
    【解决方案2】:

    您可以只使用两个不同的 sessionFactories 吗?一张用于旧表,一张用于新表?这样,您可以为每个 sessionfactory 设置不同的命名策略。

    每个 sessionfactory 有不同的 dao 类并相应地注入。

    干杯

    【讨论】:

    • 是的,我可以。但是随后我为一个请求获得了两个 sessionFactories。我必须检查用户是否使用一个 sessionFactory 登录,并使用另一个 sessionFactory 提供能量数据。使用 OpenSessionInViewFilter 我担心会一团糟。
    【解决方案3】:

    所以这就是我最终要做的。我在启动时使用 contextConfigLocation 加载的 dataAccessContext.xml 创建。这包括其中一个 sessionFactories。

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    ...
    <property name="namingStrategy" ref="namingStrategy"/>
    ...
    </bean>
    

    在我的 web.xml 中,我包含了映射到 /* 的 OpenSessionInViewFilter

    <filter>
    <filter-name>HibernateSessionRequestFilter</filter-name>    
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
    <init-param>
        <param-name>sessionFactoryBeanName</param-name>
        <param-value>sessionFactory</param-value>
    </init-param>
    

    然后另一个 sessionFactory 包含在 dataAccessContextEnergy.xml 中,它是在我的 spring config energy-config.xml 中导入的。

    Energy-config.xml 还包括一个 opensessioninviewfilterinterceptor;

    <mvc:interceptors>
     <bean class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
      <property name="sessionFactory" ref="sessionFactoryEnergy"/>
     </bean>
    

    那么我有两个 sessionFactories 和两个开放会话......我希望如此。

    这是一个好方法吗?还是我会在地狱中燃烧? :-)

    【讨论】:

      猜你喜欢
      • 2021-09-05
      • 2020-03-18
      • 2020-02-02
      • 1970-01-01
      • 2015-11-16
      • 2020-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多