将关系数据库表与Java类相关联的最佳方法是什么?

时间:2009-04-21 12:42:48

标签: java database class relational

我想知道是否有人可以在这里告诉我;我有一个类似这样的类的应用程序:

代码:

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,qty,prodID

因此,每个类直接转换为一个数据库表,每个属性都有get和set对。

现在我想知道的是,如果在Java Web应用程序中,这些类应该像上面那样,或者更像是获取返回对象的类:

代码:

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 个答案:

答案 0 :(得分:2)

绝对没有理由使用第一种形式 - 在Java代码中使用它会更加困难,并且会有很多错误。

所有体面的O / R映射器(Hibernate是最受欢迎的)将从DB模式转换为适当的OO对象图,没有任何问题。

但是,缺点是,当你把所有内容都留给OR映射器并且它从数据库中获取太多或太少的数据时,为你完成所有这些操作可能会导致very bad performance,所以你必须支付一些费用注意缓存以及您的馆藏是否为lazy or eager loading

答案 1 :(得分:1)

如果您的业务对象像这样干净,我建议您查看一个ORM映射器,如Hibernate或ActiveObjects。

如果你想建立自己的数据访问层,我建议尽量让这些类轻量级。例如,在Order中,我将有一个CustomerID整数字段代表外键,而不是getCustomer()Customer中返回Order个对象商务舱。

getCustomer()等获取方法可能更适合放在包含数据访问功能的CustomerDAO等其他类中。

从效率的角度来看,使用哪种方法并不重要,但是松散耦合的对象总是很好的做法。

答案 2 :(得分:1)

您应该查看一些对象关系映射(ORM)映射工具,例如HibernateTopLink,或者更简单的查询映射工具,例如iBatis

如果你走下ORM路线,我认为你最终会得到更像你的第二个建议。

答案 3 :(得分:1)

执行此操作的常用方法是使用对象关系映射库(ORM)。常见的是:

所有这些都是开源库,并实现了JPA(Java持久性架构)标准。

答案 4 :(得分:1)

我还建议您查看像Hibernate这样的对象关系映射工具,或者像iBatis这样的简单SQL映射工具。 (我对iBatis有很好的经验。)

关于对Order及其OrderLines之间的主 - 细节关系进行建模的问题,在Java对象级别它们肯定是同一概念层次结构的一部分,因此我选择将它们建模为包含List的Order对象。这样我就可以通过我的代码传递完整的订单,从不担心丢失部分代码。

如果您正在使用像iBatis这样的SQL映射器,那么您需要在数据库中设置Order表和OrderLine表,并为iBatis提供一个XML映射,告诉它如何组装复合Java Order / OrderLine对象层次结构通过将两个SQL表连接在一起。 ORM以相反的方式运行,根据您的Java数据模型生成SQL表。