Каков наилучший способ связать таблицы реляционных баз данных с классами Java? - PullRequest
2 голосов
/ 21 апреля 2009

Интересно, кто-нибудь может посоветовать мне здесь; У меня есть приложение, в котором есть такие классы:

Код:

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. 
}

Это переводит непосредственно в реляционную таблицу:

Заказ: orderno, customerNo, orderDate OrderLine: orderno, lineNo, кол-во, prodID

Таким образом, каждый класс напрямую преобразуется в таблицу базы данных с парами get и set для каждого атрибута.

Теперь, что я хочу знать, если в веб-приложении Java классы должны быть такими же, как они указаны выше, или более похожими на те, где возвращает объекты:

Код:

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; 
    } 
}

Какой подход лучше? Или действительно имеет значение, какой подход используется, если классы, обрабатывающие данные, делают это правильно и система работает эффективно?

Спасибо

Мистер Морган

Ответы [ 5 ]

2 голосов
/ 21 апреля 2009

Нет абсолютно никакой причины использовать первую форму - с ней будет намного сложнее работать в коде Java, и в результате будет много ошибок.

Все приличные O / R-преобразователи (Hibernate - самый популярный) без проблем преобразуют из схемы DB в надлежащие графы объектов OO.

Тем не менее, недостатком является то, что выполнение всего этого за вас может привести к очень плохой производительности , когда вы оставляете все на OR OR, и он получает слишком много или слишком мало данных из БД, поэтому нужно уделить некоторое внимание кешированию и тому, загружены ли ваши коллекции лени или загружены .

1 голос
/ 26 апреля 2009

Я бы также посоветовал вам взглянуть на инструмент объектно-реляционного сопоставления, например Hibernate, или на более простой инструмент сопоставления SQL, например iBatis. (У меня был очень хороший опыт работы с iBatis.)

Что касается моделирования отношения мастер-детализация между Order и его OrderLines, то на уровне объектов Java они, безусловно, являются частью одной концептуальной иерархии, поэтому я бы предпочел смоделировать их как объект Order, содержащий List. , Таким образом, я мог бы передавать полные Заказы по своему коду и никогда не беспокоиться о потере их частей.

Если вы используете сопоставитель SQL, такой как iBatis, вы настроите таблицу Order и таблицу OrderLine в своей базе данных и предоставите iBatis карту XML, которая расскажет, как собрать составную иерархию объектов Java Order / OrderLine соединяя две таблицы SQL вместе. ORM работают в обратном порядке, генерируя таблицы SQL на основе вашей модели данных Java.

1 голос
/ 21 апреля 2009

Обычный способ сделать это - использовать библиотеку объектно-реляционного отображения (ORM). Общие из них:

Все это библиотеки с открытым исходным кодом, реализующие стандарт JPA (Java Persistence Architecture).

1 голос
/ 21 апреля 2009

Вам следует взглянуть на какой-либо инструмент сопоставления объектно-реляционного сопоставления (ORM), например Hibernate или TopLink , или, возможно, более простой инструмент сопоставления запросов, например iBatis .

Я думаю, что у вас получится нечто более похожее на ваше второе предложение, если вы пойдете по маршруту ORM.

1 голос
/ 21 апреля 2009

Если ваши бизнес-объекты такие же чистые, я бы посоветовал взглянуть на сопоставитель ORM, такой как Hibernate или ActiveObjects.

Если вы предпочитаете создавать свой собственный слой доступа к данным, я бы посоветовал сделать эти классы как можно более легкими. Например, в Order у меня будет целое поле CustomerID, которое будет представлять внешний ключ, вместо getCustomer(), возвращающего объект Customer в бизнес-классе Order.

Методы извлечения, такие как getCustomer(), вероятно, лучше разместить в другом классе, например CustomerDAO и т. Д., Который содержит ваши функции доступа к данным.

Это не имеет большого значения с точки зрения эффективности, к которому вы подходите, но всегда полезно иметь слабосвязанные объекты.

...