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
@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 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
{
return lineItems;
}
public void setLineItems(Collection
{
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 就行了。