後輩が使ってたコードをネタとして拝借(^^;
うちでは案件管理システムなどの開発が多いのですが、業務の中で
「見積が確定して受注した際、見積の情報を受注へと引き継ぐ」
みたいなのが結構あったりします。
そんなときに見積のEntityが持つ属性情報から1つ1つ受注Entityに入れていく…みたいなことをする場合もあったりするのですが、BeanUtils使うと、簡単にプロパティ情報をコピーできて便利でした。
既に色々情報あって参考にさせて頂きました。こんなのあるなんて知らなかった(>_<;
Maven使っていればpom.xmlに以下依存性を定義するだけ。
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.1</version>
</dependency>
ちょっとしたお試しコード書いてみました。
JPAのEntityではなく、とりあえず普通のクラスです。
(Lombok使ってます)
見積の情報クラス
@Getter @Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Quote{
private String quoteId;
private String name;
private String customerId;
private BigDecimal quotePrice;
}
受注の情報クラス
@Getter @Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Order{
private String orderId;
private String name;
private String customerId;
}
で、見積のインスタンス作って、属性にも値をセット。
受注のインスタンス作ってBeansUtils.copyPropertiesで属性コピー
Quote quote = new Quote("quote1", "見積1", "hogehoge",new BigDecimal(3000));
Order order = new Order();
BeanUtils.copyProperties(order, quote);
System.out.println(quote);
System.out.println(order);
標準出力結果は以下
Quote(quoteId=quote1, name=見積1, customerId=hogehoge, quotePrice=3000)
Order(orderId=null, name=見積1, customerId=hogehoge)
プロパティ名が一致する部分だけコピーされてます。便利。
内部的にはリフレクションとか使ってるのかな?一度コードリーディングしてみたい気も。
前にディープコピーを実装したとき、Dozerとか使ったけど、これ使うのもありかなと思ったり。
というか、オフショア先のコードで、エンティティをディープコピーする際、自前で単純にnewした後、ひたすらコピー元のフィールド値を延々とセットし続けるコードを前にみたのだけど、これ使えば1行で書けるし、属性増えたときも改造いらないんだけどなぁ…。