Order.java
package org.jboss.tutorial.entity.bean;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratorType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Id;
import javax.persistence.CascadeType;
import javax.persistence.FetchType;
import java.util.ArrayList;
import java.util.Collection;
@Entity
@Table(name = "PURCHASE_ORDER")
//If the table name isn't specified it defaults to the bean name
//of the class. For instance, the LineItem EJB would be mapped to
//the LINEITEM table
public class Order implements java.io.Serializable
{
private int id;
private double total;
private Collection<LineItem> lineItems;
@Id(generate = GeneratorType.AUTO)
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public double getTotal()
{
return total;
}
public void setTotal(double total)
{
this.total = total;
}
public void addPurchase(String product, int quantity, double price)
{
if (lineItems == null) lineItems = new ArrayList<LineItem>();
LineItem item = new LineItem();
item.setOrder(this);
item.setProduct(product);
item.setQuantity(quantity);
item.setSubtotal(quantity * price);
lineItems.add(item);
total += quantity * price;
}
//CascadeType.ALL specifies that when an Order is created,
//any LineItems held in the lineItems collection will be created
//as well (CascadeType.PERSIST). If the Order is delete from
//persistence storage, all related LineItems will be
//deleted (CascadeType.REMOVE). If an Order instance is
//reattached to persistence storage, any changes to the
//LineItems collection will be merged with persistence
//storage (CascadeType.MERGE).
//FetchType.EAGER specifies that when the Order is loaded
//whether or not to prefetch the relationship as well.
//If you want the LineItems to be loaded on demand, then specify FetchType.LAZY.
// The mappedBy attribute specifies that this is a bi-directional
//relationship that is managed by the order property on the LineItem entity bean.
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy="order")
public Collection<LineItem> getLineItems()
{
return lineItems;
}
public void setLineItems(Collection<LineItem> lineItems)
{
this.lineItems = lineItems;
}
}
加了不少英文注释,希望能看得懂。
@Table(name = "PURCHASE_ORDER")
指名数据库(jboss的数据库为hsqldb)中对应得表的名字,默认为class的名字,比如下面的LineItem就没有@table。(order.java , LineItem.java都为o/r映射,值得互相对照)
@Id(generate = GeneratorType.AUTO)
递增,同数据库里的相同。必须在getter方法上标注。
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy="order")
关系:order和LineItem为1对多的关系。在这里CascadeType.ALL是指明当建立一个Order被实例化后,都应该同时同时建立LineItem。注释里的就是根据两者建立时间的不同,定义了不同的CascadeType。
LineItem.java
package org.jboss.tutorial.entity.bean;
import javax.persistence.Entity;
import javax.persistence.GeneratorType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Entity;
@Entity
public class LineItem implements java.io.Serializable
{
private int id;
private double subtotal;
private int quantity;
private String product;
private Order order;
@Id(generate = GeneratorType.AUTO)
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public double getSubtotal()
{
return subtotal;
}
public void setSubtotal(double subtotal)
{
this.subtotal = subtotal;
}
public int getQuantity()
{
return quantity;
}
public void setQuantity(int quantity)
{
this.quantity = quantity;
}
public String getProduct()
{
return product;
}
public void setProduct(String product)
{
this.product = product;
}
//The @JoinColumn specifies the foreign key column within the LineItem table.
@ManyToOne
@JoinColumn(name = "order_id")
public Order getOrder()
{
return order;
}
public void setOrder(Order order)
{
this.order = order;
}
}
ShoppingCart.java
package org.jboss.tutorial.entity.bean;
import javax.ejb.Remote;
import javax.ejb.Remove;
@Remote
public interface ShoppingCart
{
void buy(String product, int quantity, double price);
Order getOrder();
@Remove void checkout();
}
ShoppingCartBean.java
package org.jboss.tutorial.entity.bean;
import javax.persistence.EntityManager;
import javax.ejb.Inject;
import javax.ejb.Remove;
import javax.ejb.Stateful;
@Stateful
public class ShoppingCartBean implements ShoppingCart
{
@Inject
private EntityManager manager; //The EntityManager is used to do querying,
//creating, find by primary key, and removal of entity beans.
private Order order;
public void buy(String product, int quantity, double price)
{
if (order == null) order = new Order();
order.addPurchase(product, quantity, price);
}
public Order getOrder()
{
return order;
}
@Remove
public void checkout()
{
manager.persist(order);
}
}
EntityManager的作用可大了,可以用于查询,创建,删除实体Bean,这里插入个EntityManager,主要是在最后用户离开时,在数据库里保存数据,相当于保存个object。运行完Client.java后就可以在hsqldb上看到有purchase_order 和 LineItem 的两张表。HypersonicDatabase ,找到startDatabaseManager然后下面有个invoke,点击就可以访问hsqldb了。
Client.java
package org.jboss.tutorial.entity.client;
import org.jboss.tutorial.entity.bean.LineItem;
import org.jboss.tutorial.entity.bean.Order;
import org.jboss.tutorial.entity.bean.ShoppingCart;
import javax.naming.InitialContext;
public class Client
{
public static void main(String[] args) throws Exception
{
InitialContext ctx = new InitialContext();
ShoppingCart cart = (ShoppingCart) ctx.lookup(ShoppingCart.class.getName());
System.out.println("Buying 2 memory sticks");
cart.buy("Memory stick", 2, 500.00);
System.out.println("Buying a laptop");
cart.buy("Laptop", 1, 2000.00);
System.out.println("Print cart:");
Order order = cart.getOrder();
System.out.println("Total: $" + order.getTotal());
for (LineItem item : order.getLineItems())
{
System.out.println(item.getQuantity() + " " + item.getProduct() + " " + item.getSubtotal());
}
System.out.println("Checkout");
cart.checkout();
}
}
这里附上log4j.properties 在jboss-EJB-3.0_Preview_5.zip 里面没有这个老是显示缺少appender。有了这个将在该目录下生成个record.log日志文件。
log4j.properties
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=record.log
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %d{hh:mm:ss} %t %c{1} -%m%n
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.MaxFileSize=100KB
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) -%m%n
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.rootLogger=stdout,R
运行:参考installing.html
Windows下
打开命令提示符cmd,到 jboss_home/bin
Run.bat –c all
用ant
先build后run 就行了。