2

MyBatis を使用してデータベースに保存したい非常に単純なオブジェクト グラフがあります。まったく新しいオブジェクト グラフ (2 つの詳細を持つ BatisNode) を作成する場合、子オブジェクトが確実に作成されるようにコードを記述するにはどうすればよいですか? 詳細は次のとおりです。


public class BatisNode {
    protected int id;
    protected List details;
    protected String name;
        //Constructor and getters.
}

public class BatisNodeDetail {
    protected int id;
    protected BatisNode parent;
    protected String name;
        //Constructor and getters.
}

スキーマ:

CREATE TABLE ノード (
    node_id int auto_increment 主キー、
    名前 varchar(255)
);

CREATE TABLE node_detail(
    node_detail_id int auto_increment 主キー、
    名前 varchar(255)
);

マッパー:

    
        
INSERT INTO ノード (
  名前
)
SELECT #{名前};
        

        
SELECT node_id id,
名前
FROM ノード
WHERE node_id=#{id};
        

        
        


4

1 に答える 1

4

Ibatis/Mybatis は ORM ではなく、単なる DataMapper であり、これらのシナリオ (オブジェクトのグラフ) ではその単純さ/制限が特に示されます。(基本的に) オブジェクトのグラフについてはわかりません。

私が取った1つのアプローチはこれです:

私は持っている:

  1. 軽量の POJO オブジェクト (「DTO オブジェクト」) の層で、それぞれがデータベース テーブル (1 つのオブジェクト <-> db テーブルの 1 つのレコード) に対応し、プロパティ以上のものはほとんどありません (BatisNode および BatisNodeDetail の例のように)。

  2. DAOレイヤー、データソースが注入された各DTO(BatisNodeDAOおよびBatisNodeDetailDAOなど)ごとに1つのサービスオブジェクト、および標準のinsert/loadById/deleteおよびselectメソッド(iBatorがここで役立ちます)

  3. サービス層は、典型的なサービスクラス(通常はシングルトン)を持つことに加えて、いくつかの重いオブジェクト(「ドメインオブジェクト」)も定義します。これは、それらが処理し、通常はDTOオブジェクトのグラフに対応します(あなたの例では、BatisNodeWithDetails )。これらのドメイン オブジェクトは、ラップされた DTO のグラフをロード/保存する方法、DAO を呼び出す方法 (およびトランザクションの処理、「ダーティ」オブジェクトの検出など) を知っています。異なるサービス メソッドまたはユース ケースに対して、同じ DTO (つまり、個別のグラフ) をラップする複数の「ドメイン クラス」が存在する可能性があることに注意してください。

于 2011-01-25T01:02:28.810 に答える