[jboss-user] [EJB 3.0] - Relationship Only Saving 1 Child Object
ddurst@mechdrives.com
do-not-reply at jboss.com
Fri Nov 9 20:45:39 EST 2007
I am running JBoss 4.0.4.GA and JDK 1.5.0_06.
I have a One To Many relationship Order->OrderLine
I collect all the OrderLines and add them to the order and then
call the session facade to save. Unfortunately only one of my OrderLines
gets persisted. Can anyone tell me why?
Code to save Order
| order.setOrderLines(orderLines);
| OrderFCD obf = new OrderFCD();
| order = obf.create(order);
|
Order
| package beltmasta.ejb.persistance;
|
| import java.io.Serializable;
| import java.util.Calendar;
| import java.util.Collection;
| import java.util.Vector;
| import javax.persistence.CascadeType;
| import javax.persistence.Column;
| import javax.persistence.Entity;
| import javax.persistence.GeneratedValue;
| import javax.persistence.GenerationType;
| import javax.persistence.Id;
| import javax.persistence.NamedQueries;
| import javax.persistence.NamedQuery;
| import javax.persistence.OneToMany;
| import javax.persistence.OneToOne;
| import javax.persistence.Table;
| import javax.persistence.Temporal;
| import javax.persistence.TemporalType;
|
| /**
| * Entity class Order
| * @author David
| */
| @Entity
| @Table(name="belt_order")
| @NamedQueries( {
| @NamedQuery(name="order.getOrdersByCustomer", query="select object(o) from Order as o where o.status = 'O' and o.orderHeader.customer = :customer"),
| @NamedQuery(name="order.getQuotesByCustomer", query="select object(o) from Order as o where o.status = 'B' and o.orderHeader.customer = :customer"),
| @NamedQuery(name="order.getInvoicesByCustomer", query="select object(o) from Order as o where o.status = 'I' and o.orderHeader.customer = :customer"),
| @NamedQuery(name="order.getHoldOrdersByCustomer", query="select object(o) from Order as o where o.status = 'H' and o.orderHeader.customer = :customer"),
| @NamedQuery(name="order.getConsignmentOrdersByCustomer", query="select object(o) from Order as o where o.status = 'C' and o.orderHeader.customer = :customer")
| })
| public class Order implements Serializable {
| public static String BID = "B";
| public static String ORDER = "O";
| public static String INVOICE = "I";
| public static String HOLD = "H";
| public static String CONSIGNMENT = "C";
|
|
| @Id
| @GeneratedValue(strategy = GenerationType.AUTO)
| private Long id;
| private String eclipseId;
| @Column(length = 1)
| private String status;
| @Temporal(TemporalType.TIMESTAMP)
| private Calendar quoteTime;
| @Temporal(TemporalType.TIMESTAMP)
| private Calendar orderTime;
| @Temporal(TemporalType.TIMESTAMP)
| private Calendar invoiceTime;
|
| @OneToOne(cascade = CascadeType.ALL)
| private OrderHeader orderHeader;
|
| @OneToMany(mappedBy="parentOrder", cascade=CascadeType.ALL)
| private Collection <OrderLine>orderLines = new Vector<OrderLine>();
|
| public Order() {
| }
|
|
| //<editor-fold defaultstate="collapsed" desc="Properties Accessors">
| public Long getId() {
| return this.id;
| }
| public void setId(Long id) {
| this.id = id;
| }
| public String getEclipseId() {
| return eclipseId;
| }
| public void setEclipseId(String eclipseId) {
| this.eclipseId = eclipseId;
| }
| public String getStatus() {
| return status;
| }
| public void setStatus(String status) {
| this.status = status;
| }
| public Calendar getQuoteTime() {
| return quoteTime;
| }
| public void setQuoteTime(Calendar quoteTime) {
| this.quoteTime = quoteTime;
| }
| public Calendar getOrderTime() {
| return orderTime;
| }
| public void setOrderTime(Calendar orderTime) {
| this.orderTime = orderTime;
| }
| public Calendar getInvoiceTime() {
| return invoiceTime;
| }
| public void setInvoiceTime(Calendar invoiceTime) {
| this.invoiceTime = invoiceTime;
| }
|
| //</editor-fold>
| //<editor-fold defaultstate="collapsed" desc="Method Overides">
| @Override
| public int hashCode() {
| int hash = 0;
| hash += (this.id != null ? this.id.hashCode() : 0);
| return hash;
| }
| @Override
| public boolean equals(Object object) {
| // TODO: Warning - this method won't work in the case the id fields are not set
| if (!(object instanceof Order)) {
| return false;
| }
| Order other = (Order)object;
| if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) return false;
| return true;
| }
| @Override
| public String toString() {
| return id.toString();
| }
|
| //</editor-fold>
| //<editor-fold defaultstate="collapsed" desc="Logic Methods">
| public void setQuoted() {
| this.setQuoteTime(Calendar.getInstance());
| }
| public void setOrdered() {
| this.setOrderTime(Calendar.getInstance());
| }
| public void setInvoiced(){
| this.setInvoiceTime(Calendar.getInstance());
| }
| //</editor-fold>
| //<editor-fold defaultstate="collapsed" desc="Relationships">
| public OrderHeader getOrderHeader() {
| return orderHeader;
| }
| public void setOrderHeader(OrderHeader orderHeader) {
| this.orderHeader = orderHeader;
| }
| public Collection<OrderLine> getOrderLines() {
| return orderLines;
| }
| public void setOrderLines(Collection<OrderLine> orderLines) {
| System.out.println("Before # of orderlines: "+orderLines.size());
| this.orderLines = new Vector(orderLines);
| System.out.println("After # of orderlines: "+this.orderLines.size());
|
| }
| //</editor-fold>
|
| }
|
OrderLine
| package beltmasta.ejb.persistance;
|
| import beltmasta.ejb.persistance.embeddable.LineQuantity;
| import beltmasta.ejb.persistance.embeddable.PriceCost;
| import java.io.Serializable;
| import java.util.ArrayList;
| import java.util.Calendar;
| import java.util.Collection;
| import javax.persistence.AttributeOverride;
| import javax.persistence.AttributeOverrides;
| import javax.persistence.CascadeType;
| import javax.persistence.Column;
| import javax.persistence.Embedded;
| import javax.persistence.Entity;
| import javax.persistence.GeneratedValue;
| import javax.persistence.GenerationType;
| import javax.persistence.Id;
| import javax.persistence.JoinColumn;
| import javax.persistence.ManyToOne;
| import javax.persistence.NamedQueries;
| import javax.persistence.NamedQuery;
| import javax.persistence.OneToMany;
| import javax.persistence.OneToOne;
| import javax.persistence.Table;
| import javax.persistence.Temporal;
| import javax.persistence.TemporalType;
|
| /**
| * Entity class OrderLine
| * @author David
| */
| @Entity
| @Table(name="belt_order_line")
| @NamedQueries( {
| @NamedQuery(name="orderline.bybelttype.bydaterange", query="select object(ol) from OrderLine as ol where ol.belt.beltType = :type and (ol.parentOrder.orderTime >= :startDate and ol.parentOrder.orderTime <= :endDate)")
| })
|
| public class OrderLine implements Serializable {
| public static String PICKUP = "P";
| public static String SHIP_WHEN_COMP = "H";
| public static String SHIP_WHEN_SPEC = "S";
| public static String CALL_WHEN_COMP = "C";
| public static String CALL_WHEN_SPEC = "W";
| public static String CANCEL = "X";
| public static String INVOICE = "I";
| public static String CONSIGN = "N";
| public static String HOLD = "L";
|
| @Id
| @GeneratedValue(strategy = GenerationType.AUTO)
| private Long id;
| private String lineStatus = OrderLine.SHIP_WHEN_COMP;
| @Temporal(TemporalType.TIMESTAMP)
| private Calendar requiredDate;
|
| @Embedded
| @AttributeOverrides({
| @AttributeOverride(name = "order", column=@Column(name="order_qty")),
| @AttributeOverride(name = "process", column=@Column(name="process_qty")),
| @AttributeOverride(name = "released", column=@Column(name="released_qty"))
| })
| private LineQuantity quantity;
| @Embedded
| private PriceCost priceCost;
| @OneToOne(cascade = CascadeType.ALL)
| private Belt belt;
| @ManyToOne
| @JoinColumn(name="parentOrder")
| private Order parentOrder;
| @OneToMany(mappedBy="orderLine", cascade = CascadeType.ALL)
| private Collection <SlabAssignment>slabAssignments = new ArrayList<SlabAssignment>();
| public OrderLine() {
| requiredDate = Calendar.getInstance();
| requiredDate.set(Calendar.DATE,requiredDate.get(Calendar.DATE)+3);
| }
| //<editor-fold defaultstate="collapsed" desc="Properties Accessors">
| public Long getId() {
| return this.id;
| }
| public void setId(Long id) {
| this.id = id;
| }
| public String getLineStatus() {
| return lineStatus;
| }
| public void setLineStatus(String lineStatus) {
| if(lineStatus.equals(OrderLine.PICKUP) ||
| lineStatus.equals(OrderLine.SHIP_WHEN_COMP) ||
| lineStatus.equals(OrderLine.SHIP_WHEN_SPEC) ||
| lineStatus.equals(OrderLine.CALL_WHEN_SPEC) ||
| lineStatus.equals(OrderLine.CALL_WHEN_COMP) ||
| lineStatus.equals(OrderLine.CANCEL) ||
| lineStatus.equals(OrderLine.INVOICE)||
| lineStatus.equals(OrderLine.CONSIGN)||
| lineStatus.equals(OrderLine.HOLD)){
|
| this.lineStatus = lineStatus;
| }
| }
| public LineQuantity getQuantity() {
| return quantity;
| }
| public void setQuantity(LineQuantity quantity) {
| this.quantity = quantity;
| }
| public PriceCost getPriceCost() {
| return priceCost;
| }
| public void setPriceCost(PriceCost priceCost) {
| this.priceCost = priceCost;
| }
| public Calendar getRequiredDate() {
| return requiredDate;
| }
| public void setRequiredDate(Calendar requiredDate) {
| this.requiredDate = requiredDate;
| }
| //</editor-fold>
| //<editor-fold defaultstate="collapsed" desc="Method Overides">
| @Override
| public int hashCode() {
| int hash = 0;
| hash += (this.getId() != null ? this.getId().hashCode() : 0);
| return hash;
| }
| @Override
| public boolean equals(Object object) {
| // TODO: Warning - this method won't work in the case the id fields are not set
| if (!(object instanceof OrderLine)) {
| return false;
| }
| OrderLine other = (OrderLine)object;
| if (this.getId() != other.getId() && (this.getId() == null || !this.getId().equals(other.getId()))) return false;
| return true;
| }
| @Override
| public String toString() {
| return "beltmasta.ejb.persistance.OrderLine[id=" + getId() + "]";
| }
| //</editor-fold>
| //<editor-fold defaultstate="collapsed" desc="Relationships">
| public Belt getBelt() {
| return belt;
| }
| public void setBelt(Belt belt) {
| this.belt = belt;
| }
| public Collection<SlabAssignment> getSlabAssignments() {
| return slabAssignments;
| }
| public void setSlabAssignments(Collection<SlabAssignment> slabAssignments) {
| this.slabAssignments = slabAssignments;
| }
| public void addSlabAssignment(SlabAssignment assignment) {
| int open = quantity.getOpen();
| int assign = assignment.getAssignedQuantity();
| if(assign <= open) {
| quantity.setProcess(quantity.getProcess()+assign);
| assignment.setOrderLine(this);
| slabAssignments.add(assignment);
| }
| }
| public Order getParentOrder() {
| return parentOrder;
| }
| public void setParentOrder(Order parentOrder) {
| this.parentOrder = parentOrder;
| }
| //</editor-fold>
| //<editor-fold defaultstate="collapsed" desc="Logic Methods">
| public double getTotalOrderPrice() {
| return (double)(priceCost.getPrice() * quantity.getOrder());
| }
| public double getTotalOrderCost() {
| return (double)(priceCost.getCost() * quantity.getOrder());
| }
| public double getTotalOpenPrice() {
| return (double)(priceCost.getPrice() * quantity.getOpen());
| }
| public double getTotalOpenCost() {
| return (double)(priceCost.getCost() * quantity.getOpen());
| }
| //</editor-fold>
|
| }
|
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4103395#4103395
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4103395
More information about the jboss-user
mailing list