2017-12-18 9 views
0

保存サービスで更新元のオブジェクトを作成する方法:Hibernateが5.xと春データ2.xの:私はからWebアプリケーションをアップグレードしています方法

春(MVC)4.2.9.RELEASE、4.3を休止.8.Final、及び

スプリング(MVC)5.0.2.RELEASE、休止状態5.2.12.Final、および春データ2.0.2.RELEASEに1.7.1.RELEASE

ウェブアプリケーションは、WindowsとMS SQL Server 2014 Enterpriseで動作します。

アップグレードでは、HibernateとJPAの設定を変更する必要はありませんでした。ただし、プログラムの動作は非常に異なります。これについては後述します。

以下は、新しいAccountオブジェクトを保存し、新しいオブジェクトであればその値を更新してから返すアプリケーションのtypcialサービスメソッドです。 Accountオブジェクトは、次のように定義されたIDフィールドました:

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long id; 

これはservie方法である:

@Override 
@Transactional 
public Account saveAccount(Account acc) { 

    //Step 1 
    //save method from Spring Data 
    accountRepository.save(acc); 

    //stringId is set manually only once and it is set only when a new accout object is created 
    if (acc.getStringId() == null) { 

     //Step 2 
     acc.setStringId("some_string_id"); 
    } 

    return acc; 
} 

ここでは、アップグレード前に動作です:

ステップ1:ACCは同じです保存後のオブジェクトそのidフィールドは、保存後にnull値からLong値に更新されます。

手順2:新しい値がデータベースに自動的にシリアル化されます。 saveメソッドへの明示的なデータベース呼び出しはないことに注意してください。ここで

は、アップグレード後の動作です:

ステップ1:accountRepository.save(acc)を使用するだけで、ACCのオブジェクトを更新しません。

acc = accountRepository.save(acc) 

ステップ2:新しいIDを持つオブジェクトを取得するには、私はそれを次のようにしなければならない文字列IDが新しいオブジェクトのために保存されていません。

私はシステムをアップグレードする前の状態にする方法を模索しています。その理由は、アプリケーションが些細なものではなく、アプリケーションを通してプログラミングパターン(良いか悪いか)を追ってきたからです。私は多くの変更と再テストを避けたいと思います。ここで

は、関連する構成は、任意のヘルプ

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:p="http://www.springframework.org/schema/p" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xmlns:aop="http://www.springframework.org/schema/aop" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:jpa="http://www.springframework.org/schema/data/jpa" 
     xmlns:jdbc="http://www.springframework.org/schema/jdbc" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation=" 
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-3.2.xsd 
      http://www.springframework.org/schema/data/jpa  
      http://www.springframework.org/schema/data/jpa/spring-jpa-1.1.xsd        
      http://www.springframework.org/schema/tx 
      http://www.springframework.org/schema/tx/spring-tx-3.2.xsd 
      http://www.springframework.org/schema/jdbc 
      http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd"> 

    <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close"> 
     <constructor-arg ref="hikariConfig" /> 
    </bean> 

    <bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig"> 
     <property name="poolName" value="derek6HikariCP" /> 
     <property name="connectionTestQuery" value="${jdbc.connectionTestQuery}" /> 
     <property name="dataSourceClassName" value="${jdbc.dataSourceClassName}" /> 
     <property name="maximumPoolSize" value="${jdbc.maximumPoolSize}" /> 
     <property name="minimumIdle" value="${jdbc.minimumIdle}" /> 
     <property name="idleTimeout" value="${jdbc.idleTimeout}" /> 
     <property name="connectionTimeout" value="${jdbc.connectionTimeout}" /> 
     <property name="dataSourceProperties"> 
      <props> 
       <prop key="url">${jdbc.url}</prop> 
       <prop key="user">${jdbc.username}</prop> 
       <prop key="password">${jdbc.password}</prop> 
      </props> 
     </property>  
    </bean> 

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
     <constructor-arg ref="dataSource"/> 
    </bean> 

    <bean id="entityManagerFactory" name="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
     </property> 
     <property name="packagesToScan" value="myproject.entity" /> 
     <property name="jpaProperties"> 
      <props> 
       <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
       <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> 
       <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> 
       <prop key="hibernate.max_fetch_depth">${hibernate.max_fetch_depth}</prop>         
       <prop key="hibernate.jdbc.fetch_size">${hibernate.jdbc.fetch_size}</prop> 
       <prop key="hibernate.jdbc.batch_size">${hibernate.jdbc.batch_size}</prop> 
      </props> 
     </property> 
    </bean>  

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="emf" /> 
    </bean> 

    <tx:annotation-driven transaction-manager="transactionManager"/> 

    <context:annotation-config /> 

    <jpa:repositories base-package="myproject.entity" 
     entity-manager-factory-ref="emf" transaction-manager-ref="transactionManager" /> 

</beans> 

ありがとうです!

答えて

0

私はそれがフラッシュ戦略のためだと思います。調べるべきは、https://vladmihalcea.com/how-does-the-auto-flush-work-in-jpa-and-hibernate/です。よりよく理解する。

この2つのバージョンの変更の間に、フラッシュ戦略のデフォルトを変更した可能性があります。最初に上記の文書&を読んで、必要に応じてコードを設定してください。

関連する問題