こんにちは、アンダーソンです。
巷ではコロナが猛威を奮っていますね。
罹患された方が早期に回復することを祈っています。
また予防もそうですがとにかく他人に拡げないように意識していきましょう。
ということで以前に.cloneメソッドの使い方なる記事をあげたんですが、
今回は業務中に起こった落とし穴をご紹介したいと思います。
Contents
.cloneはメモリから?DBから?
今回とある案件で、.cloneメソッドを使うことがあったのですが、
cloneメソッドを使う前にclone元のsObjectをクエリでとってきていました。
で、新たにcloneを作成して、少し内容を変更したレコードをinsertして。。。
というような内容だったのですが、ふと思ったのが
.cloneメソッドのisDeepCloneはDBからやっているのか?
ということでした。
ってことで、実験です。
テスト1というオブジェクトにテキスト項目を用意してそれを必須項目にします。
で、下記のようなレコードを用意してみました。

Test1__c piyo = [SELECT Id FROM Test1__c];
Test1__c hoge = piyo.clone(false,true,false,false);
insert hoge;
で、上記コードを実行してみました。
すると・・・。

出ましたエラーです。
必須項目のテキスト項目が入っていないため怒られました。
Idをとっていたので、そのIdの項目をまるまるコピーしてくれると思ったら違うんですね。。。
Test1__c piyo = [SELECT Id,Text__c FROM Test1__c];
Test1__c hoge = piyo.clone(false,true,false,false);
insert hoge;
今度はクエリに必須項目を加えてみました。
もちろんこれはOKでした。
結論
cloneのDeepCloneは完全コピーって書いていたのであくまでもDBからのsObjectをコピーする
ものだと勘違いしていました。あくまでもクエリでとってきたメモリを完全コピーするだけのモノなので、実装の際には注意が必要ですね。
項目が多い場合や、追加した際にはクエリに追加することもお忘れなく!です。