保存サービスで更新元のオブジェクトを作成する方法: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>
ありがとうです!