Hi, I reproduced this issue with a POJO environment. Here is the test code. The SingleEMFTestCase is a mimic of the test cases of OpenJPA. It prepare the test environment in the same manner.
import javax.persistence.EntityManager; import javax.persistence.Query; import org.testng.Assert; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import com.genewoo.openjpa.test.SingleEMFTestCase; public class EventTest extends SingleEMFTestCase { @BeforeClass(alwaysRun = true) public void setUp() { setUp(BaseEntity.class, EventEntity.class, AttributeEntity.class); Assert.assertNotNull(emf); } @Test(groups = {"functional"}, enabled=true) public void testHashTypeEntityDetachedObject() { EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); EventEntity eventEntity1 = new EventEntity(); em.persist(updateEvent(eventEntity1)); EventEntity eventEntity2 = new EventEntity(); em.persist(updateEvent(eventEntity2)); Query query = em.createNamedQuery(" AttributeEntity.findByOwnerAndType"); query.setParameter(1, 1);// UtilModelConstants.ATTRIBUTE_STATUS_ACTIVE);// status cid query.setParameter(2, 1); query.setParameter(3, 1); query.setParameter(4, 1); query.getResultList(); AttributeEntity attributeEntity1 = new AttributeEntity(); em.persist(updateAttribute(attributeEntity1)); query.setParameter(1, 1);// UtilModelConstants.ATTRIBUTE_STATUS_ACTIVE);// status cid query.setParameter(2, 1); query.setParameter(3, 1); query.setParameter(4, 1); query.getResultList(); AttributeEntity attributeEntity2 = new AttributeEntity(); em.persist(updateAttribute(attributeEntity2)); em.getTransaction().commit(); em.close(); } private AttributeEntity updateAttribute(AttributeEntity attributeEntity) { attributeEntity.setFromId(1); attributeEntity.setTypeCid(1); attributeEntity.setValueCid(1); attributeEntity.setFromClassId(1); attributeEntity.setStatusCid(1); return attributeEntity; } private EventEntity updateEvent(EventEntity eventEntity) { java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis ()); eventEntity.setDateTime(sqlDate); eventEntity.setFromId(1); eventEntity.setTypeCid(1); eventEntity.setFromClassId(1); eventEntity.setStatusCid(1); return eventEntity; } } On 9/19/07, Gene Woo <[EMAIL PROTECTED]> wrote: > > In this morning, I tested my code(same as a SessionBean) with an injected > EM(non-jta). Everything works fine. > > Seems that problem is due to managed transaction setting. But I don't why > it comes... > > Gene > > > On 9/19/07, Gene Woo <[EMAIL PROTECTED]> wrote: > > > > Hi, > > > > Here is the entity definition. A simplified test case passed in POJO > > environment. But the error was happen in EJB container(WLS). > > > > BaseEntity > > > > @MappedSuperclass > > public abstract class BaseEntity implements Serializable { > > > > private static final String CLASS_NAME = BaseEntity.class.getName(); > > private static Logger _logger = Logger.getLogger(CLASS_NAME); > > > > @Id > > @Column(name = "id") > > @TableGenerator(name = "primary_key_generator", table = > > "GLOBAL_KEY", pkColumnName = "PK_NAME", valueColumnName = "SEQUENCE", > > pkColumnValue = "TMS") > > @GeneratedValue(strategy = GenerationType.TABLE, generator = > > "primary_key_generator") > > protected Integer _id; > > > > @Version > > @Column(name = "update_version") > > private Integer _version; > > > > @Column(name = "created_by") > > private String _createdBy; > > > > @Column(name = "create_date") > > private Timestamp _createDate; > > > > @Column(name = "updated_by") > > private String _updatedBy; > > > > @Column(name = "update_date") > > private Timestamp _updateDate; > > > > /** > > * Default constructor - used ONLY for new entities that have not > > been previously created > > */ > > protected BaseEntity() { > > > > super(); > > } > > > > /** > > * Constructor to create an entity for existing entities. > > * > > * @param id refers to an existing entity identifier > > * @throws InvalidPrimaryKeyException if a null value is passed in > > */ > > protected BaseEntity(Integer id) throws InvalidPrimaryKeyException { > > > > if(id == null) { > > throw new InvalidPrimaryKeyException( > > UtilServiceLocator.getInvalidPrimaryKeyExceptionContent( > > CLASS_NAME, "BaseEntity", > > ErrorDefinitionPkConstants.INVALID_PRIMARY_KEY)); > > } > > > > this._id = id; > > } > > > > /** > > * @return returns the primaryKey > > */ > > public Integer getId() { > > > > return _id; > > } > > > > /** > > * @return created_by > > */ > > public String getCreatedBy() { > > > > return this._createdBy; > > > > } > > > > /** > > * Set created_by > > * > > * @param createdBy > > */ > > public void setCreatedBy(String createdBy) { > > > > this._createdBy = createdBy; > > } > > > > /** > > * @return create_date > > */ > > public Timestamp getCreateDate() { > > > > return this._createDate; > > } > > > > /** > > * Set create_date > > * > > * @param createDate > > */ > > public void setCreateDate(Timestamp createDate) { > > > > this._createDate = createDate; > > } > > > > /** > > * @return updated_by > > */ > > public String getUpdatedBy() { > > > > return this._updatedBy; > > > > } > > > > /** > > * Set updated_by > > * > > * @param updatedBy > > */ > > public void setUpdatedBy(String updatedBy) { > > > > this._updatedBy = updatedBy; > > } > > > > /** > > * @return update_date > > */ > > public Timestamp getUpdateDate() { > > > > return this._updateDate; > > } > > > > /** > > * Set update_date > > * > > * @param updateDate > > */ > > public void setUpdateDate(Timestamp updateDate) { > > > > this._updateDate = updateDate; > > } > > > > /** > > * @see java.lang.Object#equals(java.lang.Object) > > */ > > public boolean equals(Object obj) { > > > > boolean equals = false; > > if(_id == null) { > > equals = super.equals(obj); > > } else { > > if(this.getClass().isInstance(obj)) { > > equals = _id.equals(((BaseEntity)obj)._id); > > } > > } > > return equals; > > } > > > > /** > > * Returns a hash code value for the primary key of the bean. > > * > > * @see java.lang.Object#hashCode() > > */ > > public int hashCode() { > > > > int hashcode = 0; > > if(_id == null) { > > hashcode = super.hashCode(); > > } else { > > hashcode = _id.hashCode(); > > } > > return hashcode; > > } > > > > /** > > * Set the create_date and created_by after an entity is persisted > > * > > * @param entity > > */ > > @PrePersist > > public void updateCreateAuditColumns() { > > > > setCreateDate(new Timestamp( System.currentTimeMillis())); > > setCreatedBy("test"); // need to resolve this. > > } > > > > /** > > * Set the update_date and updated_by after an entity is updated > > * > > * @param entity The updating entity. > > */ > > @PreUpdate > > public void updateUpdateAuditColumns() { > > > > setUpdateDate(new Timestamp(System.currentTimeMillis())); > > setUpdatedBy("test"); > > } > > } > > > > > > Event Entity > > > > @Entity > > @Table(name = "event") > > @NamedQueries( { > > @NamedQuery(name = "EventEntity.findByOwner", query = "SELECT i FROM > > EventEntity i WHERE i._statusCid = 1140 " > > + "AND _fromClassId =: fromClassID AND _fromId =: fromId"), > > @NamedQuery(name = "EventEntity.findAllByOwner", query = "SELECT i > > FROM EventEntity i WHERE _fromClassId =: fromClassID AND _fromId =: > > fromId")}) > > public class EventEntity extends BaseEntity { > > > > @Column(name = "from_class_id") > > private Integer _fromClassId; > > > > @Column(name = "type_cid") > > private Integer _typeCid; > > > > @Column(name = "from_id") > > private Integer _fromId; > > > > @Column(name = "status_cid") > > private Integer _statusCid; > > > > @Column(name = "date_time") > > private Date _dateTime; > > > > /** > > * Get all the entries in the event table where status_cid = 1140 > > and from_class_id = ? and from_id = ? > > * > > * @param em > > * @param fromId > > * @param fromClassId > > * @return - A collection of <code>EventEntity</code>'s > > */ > > public static Collection<EventEntity> findByOwner(EntityManager em, > > int typeCid, int fromId, int fromClassId) { > > > > Query query = em.createNamedQuery("EventEntity.findByOwner"); > > query.setParameter(1, fromId); > > query.setParameter(2, fromClassId); > > Collection<EventEntity> eventEntities = query.getResultList(); > > > > return eventEntities; > > } > > > > /** > > * Get all the entries in the event table where from_class_id = ? > > and from_id = ?, with no qualifier on the > > * status_cid column > > * > > * @param em > > * @param fromId > > * @param fromClassId > > * @return - A collection of <code>EventEntity</code>'s > > */ > > public static Collection<EventEntity> findAllByOwner(EntityManager > > em, int typeCid, int fromId, int fromClassId) { > > > > Query query = em.createNamedQuery("EventEntity.findAllByOwner"); > > query.setParameter(1, fromId); > > query.setParameter(2, fromClassId); > > Collection<EventEntity> eventEntities = query.getResultList(); > > > > return eventEntities; > > } > > > > public Integer getFromClassId() { > > > > return _fromClassId; > > } > > > > public void setFromClassId(Integer classId) { > > > > _fromClassId = classId; > > } > > > > public Integer getTypeCid() { > > > > return _typeCid; > > } > > > > public void setTypeCid(Integer cid) { > > > > _typeCid = cid; > > } > > > > public Integer getFromId() { > > > > return _fromId; > > } > > > > public void setFromId(Integer id) { > > > > _fromId = id; > > } > > > > public Integer getStatusCid() { > > > > return _statusCid; > > } > > > > public void setStatusCid(Integer cid) { > > > > _statusCid = cid; > > } > > > > public Date getDateTime() { > > > > return _dateTime; > > } > > > > public void setDateTime(Date time) { > > > > _dateTime = time; > > } > > > > } > > > > On 9/18/07, Patrick Linskey <[EMAIL PROTECTED] > wrote: > > > > > > Can you post the definitions for both classes in the hierarchy please? > > > > > > -Patrick > > > > > > On 9/18/07, Gene Woo < [EMAIL PROTECTED]> wrote: > > > > Hi, > > > > > > > > Absolutely not. Because I only exposed this private field to a > > > getting > > > > method. So it's no possible to modify this value from outside of the > > > class. > > > > > > > > BTW, this field is declared in Super class. Only these two entities > > > met the > > > > problem I described. The rest of them do not have such issue. > > > > > > > > Also, the error always comes with a optimistic lock error. But only > > > one > > > > Session Bean is working on these entities. > > > > > > > > Thanks, > > > > Gene. > > > > > > > > > > > > On 9/18/07, Patrick Linskey < [EMAIL PROTECTED]> wrote: > > > > > > > > > > > So far, my understanding on setting of the version field is a > > > qualified > > > > > > field(Integer, Long or DateType) with annotation @Version. Is > > > this the > > > > > one > > > > > > you mentioned as manually setting? > > > > > > > > > > There is (presumably) some field in your object that is marked as > > > > > @Version. Are you assigning a value to that field? > > > > > > > > > > -Patrick > > > > > > > > > > On 9/17/07, Gene Woo <[EMAIL PROTECTED]> wrote: > > > > > > Hi, > > > > > > > > > > > > I have no idea about that "manually setting the version field in > > > your > > > > > > application". > > > > > > > > > > > > So far, my understanding on setting of the version field is a > > > qualified > > > > > > field(Integer, Long or DateType) with annotation @Version. Is > > > this the > > > > > one > > > > > > you mentioned as manually setting? > > > > > > > > > > > > Thanks, > > > > > > > > > > > > Gene. > > > > > > > > > > > > On 9/18/07, Patrick Linskey < [EMAIL PROTECTED]> wrote: > > > > > > > > > > > > > > Hi, > > > > > > > > > > > > > > Are you manually setting the version field in your > > > application? > > > > > > > > > > > > > > -Patrick > > > > > > > > > > > > > > On 9/17/07, Gene Woo < [EMAIL PROTECTED]> wrote: > > > > > > > > Hi, > > > > > > > > > > > > > > > > I got the following error messages from application server. > > > I am > > > > > very > > > > > > > > confused on that. Because this is an isolated entity without > > > any > > > > > > > > relationship to the rest of entities. > > > > > > > > > > > > > > > > <4|true|0.9.7> > > > org.apache.openjpa.persistence.InvalidStateException: > > > > > > > Attempt > > > > > > > > to set column "event.update_version" to two different > > > values: (class > > > > > > > > java.lang.Integer)"2", (class java.lang.Integer)"3" This can > > > occur > > > > > when > > > > > > > you > > > > > > > > fail to set both sides of a two-sided relation between > > > objects, or > > > > > when > > > > > > > you > > > > > > > > map different fields to the same column, but you do not keep > > > the > > > > > values > > > > > > > of > > > > > > > > these fields in synch. > > > > > > > > > > > > > > > > Note: This update_version is a mapped-super class's > > > property: @ > > > > > > > > [EMAIL PROTECTED](name = "update_version") private Integer > > > _version; > > > > > > > > > > > > > > > > And I found the code only performed query and new/persist > > > object. > > > > > Not > > > > > > > intent > > > > > > > > to update or merge object. > > > > > > > > > > > > > > > > The error was found before perform query. As you know, > > > system will > > > > > flush > > > > > > > > before query. Here is the stack trace: > > > > > > > > > > > > > > > > at org.apache.openjpa.jdbc.sql.PrimaryRow.setObject( > > > > > > > PrimaryRow.java > > > > > > > > :335) > > > > > > > > at org.apache.openjpa.jdbc.sql.RowImpl.setObject( > > > > > RowImpl.java > > > > > > > :501) > > > > > > > > at > > > > > > > kodo.jdbc.meta.strats.ColumnPerLockGroupVersionStrategy.update > > > ( > > > > > > > > ColumnPerLockGroupVersionStrategy.java:166) > > > > > > > > at org.apache.openjpa.jdbc.meta.Version.update ( > > > Version.java > > > > > :294) > > > > > > > > at > > > > > > > > > > > > > > > > org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.updateIndicators( > > > > > > > > AbstractUpdateManager.java :308) > > > > > > > > at > > > > > org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.update( > > > > > > > > AbstractUpdateManager.java:291) > > > > > > > > at > > > > > > > > > > > > > > > > org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.populateRowManager > > > ( > > > > > > > > AbstractUpdateManager.java:149) > > > > > > > > at > > > > > org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush( > > > > > > > > AbstractUpdateManager.java:82) > > > > > > > > at > > > > > org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush ( > > > > > > > > AbstractUpdateManager.java:69) > > > > > > > > at > > > org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush( > > > > > > > > JDBCStoreManager.java:511) > > > > > > > > at > > > org.apache.openjpa.kernel.DelegatingStoreManager.flush( > > > > > > > > DelegatingStoreManager.java:127) > > > > > > > > at > > > org.apache.openjpa.datacache.DataCacheStoreManager.flush( > > > > > > > > DataCacheStoreManager.java:506) > > > > > > > > at > > > org.apache.openjpa.kernel.DelegatingStoreManager.flush( > > > > > > > > DelegatingStoreManager.java:127) > > > > > > > > at org.apache.openjpa.kernel.BrokerImpl.flush( > > > > > BrokerImpl.java > > > > > > > :1970) > > > > > > > > at org.apache.openjpa.kernel.BrokerImpl.flushSafe( > > > > > > > BrokerImpl.java > > > > > > > > :1868) > > > > > > > > at org.apache.openjpa.kernel.BrokerImpl.flush( > > > > > BrokerImpl.java > > > > > > > :1639) > > > > > > > > at org.apache.openjpa.kernel.QueryImpl.isInMemory ( > > > > > QueryImpl.java > > > > > > > > :948) > > > > > > > > at org.apache.openjpa.kernel.QueryImpl.execute( > > > > > QueryImpl.java > > > > > > > :782) > > > > > > > > at org.apache.openjpa.kernel.QueryImpl.execute( > > > > > QueryImpl.java > > > > > > > :761) > > > > > > > > at org.apache.openjpa.kernel.DelegatingQuery.execute > > > ( > > > > > > > > DelegatingQuery.java :528) > > > > > > > > at org.apache.openjpa.persistence.QueryImpl.execute( > > > > > > > QueryImpl.java > > > > > > > > :222) > > > > > > > > at > > > org.apache.openjpa.persistence.QueryImpl.getSingleResult ( > > > > > > > > QueryImpl.java:282) > > > > > > > > > > > > > > > > -- > > > > > > > > Best Regards, > > > > > > > > > > > > > > > > Gene Wu > > > > > > > > > > > > > > > > > > > > > > > > > > > > > -- > > > > > > > Patrick Linskey > > > > > > > 202 669 5907 > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > -- > > > > > > Best Regards, > > > > > > > > > > > > Gene Woo > > > > > > > > > > > > > > > > > > > > > -- > > > > > Patrick Linskey > > > > > 202 669 5907 > > > > > > > > > > > > > > > > > > > > > -- > > > > Best Regards, > > > > > > > > Gene Woo > > > > > > > > > > > > > -- > > > Patrick Linskey > > > 202 669 5907 > > > > > > > > > > > -- > > Best Regards, > > > > Gene Woo > > > > > -- > Best Regards, > > Gene Woo -- Best Regards, Gene Woo