我想知道是否有人可以在这里告诉我;我有一个类似这样的类的应用程序:
代码:
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;
}
}
哪种方法比较好?或者,只要处理数据的类正确地执行并且系统有效运行,采用哪种方法真的很重要吗?
谢谢
摩根先生答案 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)
答案 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表。