Anybody face this problem before ?

On Fri, Feb 13, 2009 at 2:41 PM, CG <[email protected]> wrote:
> Hi, I encounter a problem with CascadeType for a OneToMany
> relationship, hopefully somebody can help ... Thanks.
>
> I am using OpenJPA 1.0.3 that come with Apache Geronimo 2.1.3
>
>
> Basically , I have a loop to create ProductionOrder and the
> corresponding detail ProductionOrderMaterial
> After debugging , it shows that in the 2nd loop , not only INSERT
> statement is generated , there are several unnecessary UPDATE
> statements triggered , cause PersistentException ..
>
>
> Code
> ====
>
>     for loop
>
>
>                ProductionOrder productionOrder = new ProductionOrder();
>
>
>                productionOrder.setDocNo("0");
>                
> productionOrder.setQuantityOrder(node.getData().getTreeOriginalQuantityRequired()
> * salesOrderMaterial.getQuantityOrder());
>
>                
> productionOrder.setMaterial(node.getData().getBomDetail().getMaterial());
>
>
>
>                for(TreeNode<BomTreeNodeData> child : productionOrderChildren)
>                {
>                        ProductionOrderMaterial productionOrderMaterial = new
> ProductionOrderMaterial();
>
>                        productionOrderMaterial.setQuantityConsumed(0.0);
>
>                        
> productionOrderMaterial.setCreateApp(rowInfo.getCreateApp());
>                        
> productionOrderMaterial.setModifyApp(rowInfo.getModifyApp());
>                        
> productionOrderMaterial.setCreateLogin(rowInfo.getCreateLogin());
>                        
> productionOrderMaterial.setModifyLogin(rowInfo.getModifyLogin());
>                        
> productionOrderMaterial.setSessionId(rowInfo.getSessionId());
>
>
>                       // the below line will do a two-way link
> between ProductionOrder and ProductionOrderMaterial
>                        
> productionOrder.addProductionOrderMaterial(productionOrderMaterial);
>
>                }
>
>      // this line will do a _em.persist
>      productionOrderService.addProductionOrder(productionOrder);
>
> end for loop
>
>
> DEBUG Log
>
> First loop
> ============
> SELECT KEYFIELD FROM PrimaryKeys WHERE TABLENAME = ? FOR UPDATE
> [params=(String) ProductionOrder]
> UPDATE PrimaryKeys SET KEYFIELD = ? WHERE TABLENAME = ? AND KEYFIELD =
> ? [params=(long) 950, (String) ProductionOrder, (long) 900]
> SELECT KEYFIELD FROM PrimaryKeys WHERE TABLENAME = ? FOR UPDATE
> [params=(String) ProductionOrderMaterial]
> UPDATE PrimaryKeys SET KEYFIELD = ? WHERE TABLENAME = ? AND KEYFIELD =
> ? [params=(long) 950, (String) ProductionOrderMaterial, (long) 900]
>
> INSERT INTO ProductionOrder (id_ProductionOrder, prodo_Number,
> prodo_QuantityOrder, prodo_QuantityReported, version, fk_Material,
> createApp, createLogin, createTimestamp, modifyApp, modifyLogin,
> modifyTimestamp, recordStatus, sessionId, fk_SalesOrder) VALUES (?, ?,
> ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [params=(long) 900, (String) 0,
> (double) 50.0, (double) 0.0, (int) 1, (long) 100, (String) TestClient,
> (String) test, (Timestamp) 2009-02-13 13:54:12.319, (String)
> TestClient, (String) test, (Timestamp) 2009-02-13 13:54:12.319,
> (String) A, (String) , (null) null]
>
> INSERT INTO ProductionOrderMaterial (id_ProductionOrderMaterial,
> prodom_QuantityConsumed, prodom_QuantityRequired, version,
> fk_ProductionOrder, fk_Material, fk_ProductionOrderOperation,
> createApp, createLogin, createTimestamp, modifyApp, modifyLogin,
> modifyTimestamp, recordStatus, sessionId) VALUES (?, ?, ?, ?, ?, ?, ?,
> ?, ?, ?, ?, ?, ?, ?, ?) [params=(long) 900, (double) 0.0, (double)
> 100.0, (int) 1, (long) 900, (long) 101, (null) null, (String)
> TestClient, (String) test, (Timestamp) 2009-02-13 13:54:12.32,
> (String) TestClient, (String) test, (Timestamp) 2009-02-13
> 13:54:12.32, (String) A, (String) ABC]
>
> INSERT INTO ProductionOrderMaterial (id_ProductionOrderMaterial,
> prodom_QuantityConsumed, prodom_QuantityRequired, version,
> fk_ProductionOrder, fk_Material, fk_ProductionOrderOperation,
> createApp, createLogin, createTimestamp, modifyApp, modifyLogin,
> modifyTimestamp, recordStatus, sessionId) VALUES (?, ?, ?, ?, ?, ?, ?,
> ?, ?, ?, ?, ?, ?, ?, ?) [params=(long) 901, (double) 0.0, (double)
> 150.0, (int) 1, (long) 900, (long) 102, (null) null, (String)
> TestClient, (String) test, (Timestamp) 2009-02-13 13:54:12.32,
> (String) TestClient, (String) test, (Timestamp) 2009-02-13
> 13:54:12.32, (String) A, (String) ABC]
>
> 2nd Loop
> ==========
> INSERT INTO ProductionOrder (id_ProductionOrder, prodo_Number,
> prodo_QuantityOrder, prodo_QuantityReported, version, fk_Material,
> createApp, createLogin, createTimestamp, modifyApp, modifyLogin,
> modifyTimestamp, recordStatus, sessionId, fk_SalesOrder) VALUES (?, ?,
> ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [params=(long) 901, (String) 0,
> (double) 100.0, (double) 0.0, (int) 1, (long) 101, (String)
> TestClient, (String) test, (Timestamp) 2009-02-13 13:54:12.363,
> (String) TestClient, (String) test, (Timestamp) 2009-02-13
> 13:54:12.363, (String) A, (String) , (null) null]
>
>  INSERT INTO ProductionOrderMaterial (id_ProductionOrderMaterial,
> prodom_QuantityConsumed, prodom_QuantityRequired, version,
> fk_ProductionOrder, fk_Material, fk_ProductionOrderOperation,
> createApp, createLogin, createTimestamp, modifyApp, modifyLogin,
> modifyTimestamp, recordStatus, sessionId) VALUES (?, ?, ?, ?, ?, ?, ?,
> ?, ?, ?, ?, ?, ?, ?, ?) [params=(long) 902, (double) 0.0, (double)
> 1000.0, (int) 1, (long) 901, (long) 106, (null) null, (String)
> TestClient, (String) test, (Timestamp) 2009-02-13 13:54:12.364,
> (String) TestClient, (String) test, (Timestamp) 2009-02-13
> 13:54:12.364, (String) A, (String) ABC]
>
> 3 INSERT INTO ProductionOrderMaterial (id_ProductionOrderMaterial,
> prodom_QuantityConsumed, prodom_QuantityRequired, version,
> fk_ProductionOrder, fk_Material, fk_ProductionOrderOperation,
> createApp, createLogin, createTimestamp, modifyApp, modifyLogin,
> modifyTimestamp, recordStatus, sessionId) VALUES (?, ?, ?, ?, ?, ?, ?,
> ?, ?, ?, ?, ?, ?, ?, ?) [params=(long) 903, (double) 0.0, (double)
> 400.0, (int) 1, (long) 901, (long) 107, (null) null, (String)
> TestClient, (String) test, (Timestamp) 2009-02-13 13:54:12.364,
> (String) TestClient, (String) test, (Timestamp) 2009-02-13
> 13:54:12.364, (String) A, (String) ABC]
>
> INSERT INTO ProductionOrderMaterial (id_ProductionOrderMaterial,
> prodom_QuantityConsumed, prodom_QuantityRequired, version,
> fk_ProductionOrder, fk_Material, fk_ProductionOrderOperation,
> createApp, createLogin, createTimestamp, modifyApp, modifyLogin,
> modifyTimestamp, recordStatus, sessionId) VALUES (?, ?, ?, ?, ?, ?, ?,
> ?, ?, ?, ?, ?, ?, ?, ?) [params=(long) 904, (double) 0.0, (double)
> 400.0, (int) 1, (long) 901, (long) 104, (null) null, (String)
> TestClient, (String) test, (Timestamp) 2009-02-13 13:54:12.364,
> (String) TestClient, (String) test, (Timestamp) 2009-02-13
> 13:54:12.364, (String) A, (String) ABC]
> 341703  QERP_EJB  TRACE  [ejbd 11] openjpa.jdbc.SQL - <t 19397104,
> conn 32165850> [0 ms] spent
>
>
>
> < below are unnecessary UPDATE statement >
>
> UPDATE ProductionOrder SET version = ?, createApp = ?, createLogin =
> ?, createTimestamp = ?, modifyApp = ?, modifyLogin = ?,
> modifyTimestamp = ?, recordStatus = ?, sessionId = ? WHERE
> id_ProductionOrder = ? AND version = ? [params=(int) 2, (String)
> TestClient, (String) test, (Timestamp) 2009-02-13 13:54:12.319,
> (String) TestClient, (String) test, (Timestamp) 2009-02-13
> 13:54:12.365, (String) A, (String) , (long) 900, (int) 1]
>
> UPDATE ProductionOrderMaterial SET version = ?, createApp = ?,
> createLogin = ?, createTimestamp = ?, modifyApp = ?, modifyLogin = ?,
> modifyTimestamp = ?, recordStatus = ?, sessionId = ? WHERE
> id_ProductionOrderMaterial = ? AND version = ? [params=(int) 2,
> (String) TestClient, (String) test, (Timestamp) 2009-02-13
> 13:54:12.32, (String) TestClient, (String) test, (Timestamp)
> 2009-02-13 13:54:12.365, (String) A, (String) ABC, (long) 901, (int)
> 2]
>
> UPDATE ProductionOrderMaterial SET version = ?, createApp = ?,
> createLogin = ?, createTimestamp = ?, modifyApp = ?, modifyLogin = ?,
> modifyTimestamp = ?, recordStatus = ?, sessionId = ? WHERE
> id_ProductionOrderMaterial = ? AND version = ? [params=(int) 2,
> (String) TestClient, (String) test, (Timestamp) 2009-02-13
> 13:54:12.32, (String) TestClient, (String) test, (Timestamp)
> 2009-02-13 13:54:12.365, (String) A, (String) ABC, (long) 900, (int)
> 2]
>
>
>
>
> Below are classes for reference
>
> public class ProductionOrder extends BaseEntity
> {
>
>        @OneToMany(cascade=
> {CascadeType.PERSIST,CascadeType.REFRESH,CascadeType.REMOVE}, fetch =
> FetchType.EAGER, mappedBy="productionOrder",
> targetEntity=ProductionOrderMaterial.class)
>        private List<ProductionOrderMaterial> productionOrderMaterials;
>
>        @PrePersist
>        void prePersist() throws BusinessException {
>                validate();
>
>                rowInfo.setRecordStatus("A");
>
>            java.util.Date today = new java.util.Date();
>
>            rowInfo.setModifyTimestamp(new 
> java.sql.Timestamp(today.getTime()));
>            rowInfo.setCreateTimestamp(rowInfo.getModifyTimestamp());
>                System.out.println("[PrePersist] " + rowInfo.getCreateLogin());
>        }
>
>
>        @PreUpdate
>        void preUpdate() throws BusinessException {
>                if(rowInfo.getRecordStatus()!="D")
>                {
>                        validate();
>                }
>                        java.util.Date today = new java.util.Date();
>
>                        rowInfo.setModifyTimestamp(new 
> java.sql.Timestamp(today.getTime()));
>
>
>        }
>
> public class ProductionOrderMaterial extends BaseEntity
> {
>
>        @ManyToOne
>       @JoinColumn(name="fk_ProductionOrder")
>        private ProductionOrder productionOrder;
>
>
>
>        @PrePersist
>        void prePersist() throws BusinessException {
>                validate();
>
>                rowInfo.setRecordStatus("A");
>
>            java.util.Date today = new java.util.Date();
>
>            rowInfo.setModifyTimestamp(new 
> java.sql.Timestamp(today.getTime()));
>            rowInfo.setCreateTimestamp(rowInfo.getModifyTimestamp());
>
>        }
>
>
>        @PreUpdate
>        void preUpdate() throws BusinessException {
>                if(rowInfo.getRecordStatus()!="D")
>                {
>                        validate();
>                }
>                        java.util.Date today = new java.util.Date();
>
>                        rowInfo.setModifyTimestamp(new 
> java.sql.Timestamp(today.getTime()));
>
>
>        }
>
>
>
>
>
>
>
> }
>

Reply via email to