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 应用程序中,这些类应该像上面那样还是更像这样,其中获取返回对象:

代码:

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 映射器并且它从数据库中获取太多或太少的数据时,您必须注意缓存以及是否您的收藏是惰性或急切的加载

于 2009-04-21T12:52:48.290 回答
1

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

关于对 Order 及其 OrderLine 之间的主从关系建模的问题,在 Java 对象级别,它们当然是相同概念层次结构的一部分,因此我会选择将它们建模为包含 List 的 Order 对象。这样我就可以在我的代码周围传递完整的订单,而不必担心丢失部分订单。

如果你使用像 iBatis 这样的 SQL 映射器,你需要在数据库中设置一个 Order 表和一个 OrderLine 表,然后给 iBatis 一个 XML 映射,告诉它如何通过加入两个 SQL 表放在一起。ORM 反向操作,根据您的 Java 数据模型生成 SQL 表。

于 2009-04-26T14:59:42.177 回答
1

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

如果您更愿意构建自己的数据访问层,我建议使这些类尽可能轻量级。例如在 中Order,我将有一个CustomerID表示外键的整数字段,而不是在业务类中getCustomer()返回一个Customer对象。Order

诸如此类的获取方法可能会更好地放置在包含您的数据访问功能getCustomer()的不同类中,例如etc。CustomerDAO

从效率的角度来看,您使用哪种方法并不重要,但是拥有松散耦合的对象始终是一种好习惯。

于 2009-04-21T12:53:20.413 回答
1

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

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

于 2009-04-21T12:54:11.580 回答
1

常见的方法是使用对象关系映射库 (ORM)。常见的有:

所有这些都是开源库并实现了 JPA(Java Persistence Architecture)标准。

于 2009-04-21T12:54:30.050 回答