You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@openjpa.apache.org by CG <le...@gmail.com> on 2009/02/13 07:41:51 UTC

Cascade.Type misbehaviour for PERSIST in a for loop, extra UPDATE statement triggerred in the 2nd loop

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()));
		
		
	}







}

Re: Cascade.Type misbehaviour for PERSIST in a for loop, extra UPDATE statement triggerred in the 2nd loop

Posted by CG <le...@gmail.com>.
Anybody face this problem before ?


On Fri, Feb 13, 2009 at 2:41 PM, CG <le...@gmail.com> 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()));
>
>
>        }
>
>
>
>
>
>
>
> }
>

Unnecessary Update - Entity not changed, but update statement exectuted

Posted by Norbert Rieger <nr...@lplusr.de>.
Hello,

when looking at my openEjb log file, I can see some updates I've never done
:-)

It looks like the entity is updated with the same values as stored already
in the database, the entity object was not modified.

This is what I do:

	Bti ent ;

	tx.begin () ;                
		ent = em.find (Bti.class, 200L) ;
	tx.commit () ;

and here's the result from the log:


11437  PersistencePU  TRACE  [main] openjpa.jdbc.SQL - <t 15431769, conn
13330996> executing prepstmnt 31536808 SELECT t0.genDate, t0.modDate,
t0.bt_pkey, t0.descr, t0.fifo_order, t0.fifo_window, t0.ident, t0.type FROM
Bti t0 WHERE t0.pkey = ? [params=(long) 200]
...

Why is this update done ?
------------------==>
32719  PersistencePU  TRACE  [main] openjpa.jdbc.SQL - <t 15431769, conn
816382> executing prepstmnt 2665317 UPDATE Bti SET genDate = ?, modDate = ?,
bt_pkey = ?, descr = ?, fifo_order = ?, fifo_window = ?, ident = ?, type = ?
WHERE pkey = ? [params=(Timestamp) 2009-02-13 09:47:18.828, (Timestamp)
2009-02-13 09:59:06.375, (null) null, (null) null, (String) DESC, (int)
4711, (String) BTI-1, (String) TIMESTAMP, (long) 200]
------------------<==


Can someone point me to what I'm doing wrong ?

Thanks a lot for your help

Norbert




Here's the entity definition:


@NamedQueries
({
    @NamedQuery(name="Bti.findAll",       query="SELECT o FROM Bti o WHERE
o.btPkey = :btPkey"),
    @NamedQuery(name="Bti.findByIdent",   query="SELECT o FROM Bti o WHERE
o.btPkey = :btPkey and o.ident = :ident")
})
@Entity
@Table(uniqueConstraints=@UniqueConstraint(columnNames={"bt_pkey",
"ident"}))
public class Bti extends EntityBaseTimestamps implements Serializable 
{
    @Id
    @TableGenerator (name="PK_GEN_BTI",
                     table="PK_GEN",
                     pkColumnName="PK_IDENT",
                     pkColumnValue="BTI.PKEY",
                     valueColumnName="PK_VALUE")
    @GeneratedValue (strategy=GenerationType.TABLE,
                     generator="PK_GEN_BTI")
    private Long pkey;
    
    private String ident ;
    
    @Column(name="bt_pkey")
    private Long btPkey ;
    
    private Long descr ;
    
    @Enumerated(EnumType.STRING)
    @Column(name="type",length=32)
    BtiType_e type ;
    
    @Enumerated(EnumType.STRING)
    @Column(name="fifo_order",length=32)
    BtiFiFoOrder_e fifoOrder ;
    
    @Column(name="fifo_window")
    Integer fifoWindow ;
    
    public Bti() 
    {
    }
}

EntityBaseTimestamps is a @MappedSuperclass holding modDate and genDate
fields.