SpringBootでJPAを使ったDBのアクセス方法についての質問です。JPAの永続化コンテキストでは明示的にリポジトリでのsave()メソッドを実行しなくとも実際のDBの値が変わるというのが仕様というのは理解しているのですが、データを参照専用として取得しDBへの書き換えをせずに使用したいのです。
知りたいこと
明示的にリポジトリのsave()
を実行しないとDBの書き換えを行わないような設定方法が存在しないでしょうか?
EntityManagerのメソッド detach()
clear()
を行うことで管理状態からはずすという方法が正攻法だと思いますが、複数人が開発する環境下でアプリケーションの実装者が気をつけるルールではなく、設定で回避できれば良いなと思っています。
サンプルコード
データソースやエンティティマネージャの設定、application.ymlの設定でDBへの接続は出来ているものとします。
java
1@Entity 2public class User { 3 @Getter @Setter Long id; 4 @Getter @Setter String name; 5} 6 7@Repository 8public interface UserRepository extends JpaRepository<User, Long> { 9}
このような、実装されていたときサービスクラスで以下のようにUser全件返すようなメソッドがあった場合、
java
1public class UserService { 2 @Autowired UserRepository repo; 3 public List<User> getAllUsers() { 4 return repo.findAll(); 5 } 6}
このサービスメソッドを使用するアプリ側のメソッドでエンティティに対して値のセットを行う
java
1public Application { 2 @Autowired UserService service; 3 public void hoge() { 4 List<User> users = service.getAllUsers(); 5 users.get(0).setName("hogehoge"); 6 } 7}
試したこと
- わからないながらもサービスクラスのメソッドやアプリケーションのメソッドに対して
@Transactional(readOnly=true)
を付けてみたのですが効果はありませんでした。 EntityManagerFactory
,TransactionManager
の生成時のプロパティにないか下記のページは見てみたのですが回答にたどり着けるような記述は見つけられませんでした。
設定以外でも、リポジトリ、サービスのメソッドのなかで回避できるような実装の工夫などヒントがありましたら幸いです。
あなたの回答
tips
プレビュー