Relationship Only Saving 1 Child Object
ddurst Nov 9, 2007 8:45 PMI 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> }