2

誰かがここで私にアドバイスできるかしら。私はこのようなクラスを持つアプリケーションを持っています:

コード:

public class Order implements Serializable { 
    private int orderNo; 
    private int customerNo;    
    private date orderDate; 

    public int getOrderNo () { 
        return orderNo; 
    } 

    public int getCustomerNo () { 
        return customerNo; 
    } 

    public date getOrderDate () { 
        return orderDate; 
    } 

    // And so on with set methods. 

} 

public class OrderLine implements Serializable { 
    private int orderNo; 
    private int lineNo;    
    private int qty; 
    private int prodID; 

    // Get and set methods for each of the above. 
    public int getOrderNo () { 
        return orderNo; 
    } 

    public int getLineNo () { 
        return lineNo; 
    } 

    public int getQty () { 
        return qty; 
    } 

    public int prodID () { 
        return prodID; 
    } 
    // And so on with set methods. 
}

これは、リレーショナルテーブルに直接変換されます。

Order:orderno、customerNo、orderDate OrderLine:orderno、lineNo、qty、prodID

したがって、各クラスは、各属性のgetとsetのペアを持つデータベーステーブルに直接変換されます。

ここで私が知りたいのは、Java Webアプリケーションの場合、クラスが上記のようになっている必要があるか、getsがオブジェクトを返す場合は次のようになっている必要があるということです。

コード:

public class Order implements Serializable { 
    private int orderNo; 
    private Customer;    
    private date orderDate; 
    private ArrayList<OrderLine>lineItems; 

    public int getOrderNo () { 
        return orderNo; 
    } 

    public Customer getCustomer () { 
        return Customer; 
    } 

    public date getOrderDate () { 
        return orderDate; 
    } 

    public ArrayList<OrderLine> getOrderLines () { 
        return lineItems; 
    } 

    public OrderLine[] getOrderLines () { 
        return lineItems; 
    } 
    // And so on with set methods.     
} 

public class OrderLine implements Serializable { 
    private int orderNo; 
    private int lineNo;    
    private int qty; 
    private Product; 

    // Get and set methods for each of the above. 

    public int getOrderNo () { 
        return orderNo; 
    } 

    public int getLineNo () { 
        return lineNo; 
    } 

    public int getQty () { 
        return qty; 
    } 

    public int getProduct () { 
        return Product; 
    } 
}

どちらがより良いアプローチですか?それとも、データを処理するクラスが正しく実行し、システムが効率的に動作する限り、どちらのアプローチを採用するかは本当に重要ですか?

ありがとう

モーガン氏

4

5 に答える 5

2

最初の形式を使用する理由はまったくありません。Java コードでの作業がはるかに難しくなり、その結果として多くのバグが発生します。

すべての適切な O/R マッパー (Hibernate が最も人気のあるものです) は、DB スキーマから適切な OO オブジェクト グラフに問題なく変換します。

ただし、マイナス面は、すべてを OR マッパーに任せると、パフォーマンスが非常に低下する可能性があり、DB からフェッチするデータが多すぎたり少なすぎたりする可能性があることです。あなたのコレクションは遅延または熱心な読み込みです。

于 2009-04-21T12:52:48.290 に答える
1

ビジネス オブジェクトがこれほどクリーンな場合は、Hibernate や ActiveObjects などの ORM マッパーを検討することをお勧めします。

独自のデータ アクセス層を構築する場合は、これらのクラスをできるだけ軽量にすることをお勧めします。たとえば、ビジネス クラスでオブジェクトを返す代わりに、外部キーOrderCustomerID表す整数フィールドを使用します。getCustomer()CustomerOrder

などのフェッチ メソッドは、データ アクセス機能を含む etc などgetCustomer()の別のクラスに配置することをお勧めします。CustomerDAO

どちらのアプローチを採用するかは、効率の観点からはそれほど重要ではありませんが、オブジェクトを疎結合にすることは常に良い習慣です。

于 2009-04-21T12:53:20.413 に答える
1

HibernateTopLinkなどのオブジェクト リレーショナル マッピング (ORM) マッピング ツール、またはiBatisなどのより単純なクエリ マッピング ツールを調べる必要があります。

ORMルートをたどると、2番目の提案に似たものになると思います。

于 2009-04-21T12:54:11.580 に答える
1

これを行う一般的な方法は、オブジェクト リレーショナル マッピング ライブラリ (ORM) を使用することです。一般的なものは次のとおりです。

これらはすべてオープン ソース ライブラリであり、JPA (Java Persistence Architecture) 標準を実装しています。

于 2009-04-21T12:54:30.050 に答える
1

また、Hibernate のようなオブジェクト リレーショナル マッピング ツールや、iBatis のような単純な SQL マッピング ツールを検討することもお勧めします。(私は iBatis で非常に良い経験をしました。)

Order とその OrderLines の間の主従関係をモデル化するという問題については、Java オブジェクト レベルでは、それらは確かに同じ概念階層の一部であるため、List を含む Order オブジェクトとしてモデル化することを選択します。そうすれば、コード全体で完全な Order を渡すことができ、それらの一部が失われる心配はありません。

iBatis のような SQL マッパーを使用している場合は、データベースに Order テーブルと OrderLine テーブルを設定し、iBatis に XML マップを渡します。 2 つの SQL テーブルを一緒に。ORM は逆に動作し、Java データ モデルに基づいて SQL テーブルを生成します。

于 2009-04-26T14:59:42.177 に答える