57.2.8. 8.OneToMany
アノテーション @OneToMany の目的は、POJO クラスを定義する List<?> フィールド、または反復グループが含まれるレコードから機能できるようにすることです。
OneToMany
の制限では、多くのバインドに対する制限では、階層の複数のレベルで定義された繰り返しを処理することはできません。
以下の場合、関係 OneToMany のみの WORKS です。
- 反復グループを含む FIX メッセージの読み取り(タグ/キーのグループ=)
- 繰り返しデータを使用した CSV の生成
| アノテーション名 | レコードの種類 | レベル |
|---|---|---|
| OneToMany | all | プロパティー |
| パラメーター名 | タイプ | 必須/任意 | デフォルト値 | Info |
|---|---|---|---|---|
| mappedTo | 文字列 | Class> の List<Type のタイプに関連付けられたクラス名 |
ケース 1: 繰り返しデータを使用した CSV の生成
必要な CSV 出力は次のとおりです。
Claus,Ibsen,Camel in Action 1,2010,35
Claus,Ibsen,Camel in Action 2,2012,35
Claus,Ibsen,Camel in Action 3,2013,35
Claus,Ibsen,Camel in Action 4,2014,35
繰り返しデータは書籍のタイトルとその公開日に関与しますが、最初は姓と年齢が一般的であり、モデル化に使用されるクラスです。Author クラスには、Book の List が含まれます。
繰り返しデータを使用した CSV の生成
@CsvRecord(separator=",")
public class Author {
@DataField(pos = 1)
private String firstName;
@DataField(pos = 2)
private String lastName;
@OneToMany
private List<Book> books;
@DataField(pos = 5)
private String Age;
}
public class Book {
@DataField(pos = 3)
private String title;
@DataField(pos = 4)
private String year;
}
ケース 2: タグ/キーのグループを含む FIX メッセージの読み取り
モデルで処理するメッセージを以下に示します。
8=FIX 4.19=2034=135=049=INVMGR56=BRKR
1=BE.CHM.00111=CHM0001-0158=this is a camel - bindy test
22=448=BE000124567854=1
22=548=BE000987654354=2
22=648=BE000999999954=3
10=220
タグ 22、48、および 54 が繰り返されます。
コードは以下のようになります。
タグ/キーのグループを含む FIX メッセージの読み取り
public class Order {
@Link Header header;
@Link Trailer trailer;
@KeyValuePairField(tag = 1) // Client reference
private String account;
@KeyValuePairField(tag = 11) // Order reference
private String clOrdId;
@KeyValuePairField(tag = 58) // Free text
private String text;
@OneToMany(mappedTo = "org.apache.camel.dataformat.bindy.model.fix.complex.onetomany.Security")
List<Security> securities;
}
public class Security {
@KeyValuePairField(tag = 22) // Fund ID type (Sedol, ISIN, ...)
private String idSource;
@KeyValuePairField(tag = 48) // Fund code
private String securityCode;
@KeyValuePairField(tag = 54) // Movement type ( 1 = Buy, 2 = sell)
private String side;
}