親バカエンジニアのナレッジ帳

webのエンジニアをやっており、日頃の開発で詰まったことや書き残しておきたいことを載せています。

Spring BootでEntityオブジェクトのクローンをしてみる


Entityオブジェクトのクローン

SpringBootで機能の実装をしている中で、Entityオブジェクトのクローンを作りたくなることはありませんか?

例えばコピー機能などを想像してみてください。
いちいちオブジェクトをnewして、同じ値を全てsetして保存する...そんな方法でもできますが、綺麗なやり方ではないですよね。
属性が多ければsetの漏れも出るかもしれません。
そんな時、Entityオブジェクトのcloneを使えば、楽にクローンを作ることができます。

クローンをしたいEntityクラスにCloneableインターフェースを実装

例えばtestEntityをクローンする場合、まずは以下のようにCloneableインターフェースを継承します。

@Entity
public class testEntity implements Cloneable {

これを忘れると、後々以下のようなエラーが発生するので気をつけてください。

CloneNotSupportedException

そして以下のようにEntityにcloneメソッドを追加します。
※引数の「User user」や各種setはもちろんなくても大丈夫です。あくまで以下のようなことができるという参考にしてください。

public testEntity clone(User user) throws CloneNotSupportedException {
	TestEntity cloneTestEntity = (TestEntity) super.clone();
	cloneTestEntity.setId(null); // 新規のエンティティの場合はidをnullにしておきましょう。そうしないとクローン元のオブジェクトの上書きになってしまいます。
	cloneTestEntity.setCreatedUser(user); // 例えばこのuserのように引数をセットすることが可能です。
	cloneTestEntity.setCreatedAt(new Date());
	return cloneTestEntity;
}



クローンメソッドの呼び出し

あとは以下のようにcloneメソッドを呼び出せばクローンを取得することが可能になります。
originalTestEntityはクローン元のオブジェクトになります。

TestEntity testEntity = originalTestEntity.clone(user);


Fire TV Stick

Fire TV Stick

  • 発売日: 2017/04/06
  • メディア: エレクトロニクス
Fire TV Stick 4K - Alexa対応音声認識リモコン付属

Fire TV Stick 4K - Alexa対応音声認識リモコン付属

  • 発売日: 2018/12/12
  • メディア: エレクトロニクス
Fire HD 10 タブレット (10インチHDディスプレイ) 64GB - Alexa搭載

Fire HD 10 タブレット (10インチHDディスプレイ) 64GB - Alexa搭載

  • 発売日: 2017/10/11
  • メディア: エレクトロニクス