Order
我们需要创建的下一个类是Order,它甚至比Product更简单:它只包含ID、创建日期、总价格和该Order所包括的OrderItems的Set。当然,还需要创建getter和setter方法以及默认的构造函数。
package test.hibernate;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
public class Order {
private String id;
private Date date;
private double priceTotal;
private Set orderItems = new HashSet();
// 自动设置该Order的创建时间
public Order() {
this.date = new Date();
}
public String getId() {
return id;
}
public void setId(String string) {
id = string;
}
// 为了简洁起见,其他getter/setter方法没有显示
// ...
}
同样也要重写toString()方法。不要忘记对orderItems执行循环!
OrderItem
这个类稍微复杂一些,但仍然很易懂。我们的业务需求决定我们需要一定量的产品,我们将会把它们放到一个订单中。那些产品将自动变成订单项。这时就需要自定义构造函数了。
package test.hibernate;
public class OrderItem {
/**
* 创建有效的订单项。自动设置订单项的价格,并更正产品的库存可用量
*
* @param order 该订单项属于的订单
* @param product 该订单项为哪种产品而创建
* @param amount
*/
public OrderItem(Order order,
Product product,
int amount) {
this.order = order;
this.product = product;
this.amount = amount;
product.setAmount(product.getAmount() - amount);
this.price = product.getPrice() * amount;
}
// 还需要默认的构造函数来保证Hibernate工作
/**
* 空构造函数遵循JavaBeans约定
*
*/
public OrderItem() {
// 空的默认构造函数
}
// 字段
private String id;
private Product product;
private Order order;
private String productId;
private String orderId;
private double price;
private int amount;
public String getId() {
return id;
}
public String getProductId() {
return product.getId();
}
public String getOrderId() {
return order.getId();
}
// 其他getter/setter方法没有显示
// ...
//显示该订单项的方便方式
public String toString() {
return
"[OrderItem] id=" + id + " amount=" +
amount + " price=" + price + "(" +
product + ")";
}
}
现在我们有了反映数据库结构的所有类。余下的唯一一件没有解释的事情就是如何把产品放到一个订单中。只需把下面的方法添加到Order类中:
/**
* 添加一项产品到订单中。产品自动成为一个订单项。
* priceTotal被自动更新。
*
* @param p 添加到该订单的产品
* @param amount 添加的产品量
*/
public void addProduct(Product p,
int amount) {
OrderItem orderItem = new OrderItem(this,
p, amount);
this.priceTotal = this.priceTotal
+ p.getPrice() * amount;
this.orderItems.add(orderItem);
}
启动Hibernate
在我们假想的应用程序中,基本的使用模式非常简单:我们将创建一个Product,然后将其持久化(或者换句话说,保存它);我们将搜索并加载一个已经持久化的Product,并确保其可以使用;我们将会更新和删除Product。
