Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] Fwd: Entity being inserted even though it has an id?

You should not have any detached objects in your persistence context.  To
related a managed object to a detached object you should first find() the
detached object and assign the result of the find to managed object.

You could also call merge() on the detached object (if it has changes,
otherwise use find())  and assign the "result" of the merge to the managed
object.



Sean Adkinson wrote:
> 
> Hi there,
> 
> I have a strange situation where I can't figure out why an INSERT is being
> sent to the database.  The object was retrieved from the database
> (although
> is now detached), it has an id, and is mapped correctly as far as I can
> tell.
> 
> Here is the log below the last line of my own code.
> 
> 
>> Call: INSERT INTO THE_STATUS (the_status_id, create_actor_id,
>> the_status_name, is_active, modify_actor_id, row_id, sort_order) VALUES
>> (?,
>> ?, ?, ?, ?, ?, ?)
>> bind => [3, null, Active, true, null,
>> 8654DBCF-3D17-48D1-83E5-3520338BAEAC, 3]
>> Query: WriteObjectQuery(com.company.TheStatus[ theStatusId=3 ])
>> at
>> org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:324)
>>  at
>> org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:840)
>> at
>> org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:906)
>>  at
>> org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:592)
>> at
>> org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:535)
>>  at
>> org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:1702)
>> at
>> org.eclipse.persistence.sessions.server.ClientSession.executeCall(ClientSession.java:253)
>>  at
>> org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:207)
>> at
>> org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:193)
>>  at
>> org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.insertObject(DatasourceCallQueryMechanism.java:342)
>> at
>> org.eclipse.persistence.internal.queries.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:162)
>>  at
>> org.eclipse.persistence.internal.queries.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:177)
>> at
>> org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.insertObjectForWrite(DatabaseQueryMechanism.java:472)
>>  at
>> org.eclipse.persistence.queries.InsertObjectQuery.executeCommit(InsertObjectQuery.java:80)
>> at
>> org.eclipse.persistence.queries.InsertObjectQuery.executeCommitWithChangeSet(InsertObjectQuery.java:90)
>>  at
>> org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.performUserDefinedWrite(DatabaseQueryMechanism.java:564)
>> at
>> org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.performUserDefinedInsert(DatabaseQueryMechanism.java:532)
>>  at
>> org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.insertObjectForWrite(DatabaseQueryMechanism.java:402)
>> at
>> org.eclipse.persistence.queries.WriteObjectQuery.executeCommitWithChangeSet(WriteObjectQuery.java:121)
>>  at
>> org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.executeWriteWithChangeSet(DatabaseQueryMechanism.java:287)
>> at
>> org.eclipse.persistence.queries.WriteObjectQuery.executeDatabaseQuery(WriteObjectQuery.java:58)
>>  at
>> org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:829)
>> at
>> org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:728)
>>  at
>> org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:108)
>> at
>> org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:85)
>>  at
>> org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2863)
>> at
>> org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1501)
>>  at
>> org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1483)
>> at
>> org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1443)
>>  at
>> org.eclipse.persistence.mappings.ObjectReferenceMapping.update(ObjectReferenceMapping.java:1157)
>> at
>> org.eclipse.persistence.mappings.ObjectReferenceMapping.preUpdate(ObjectReferenceMapping.java:591)
>>  at
>> org.eclipse.persistence.descriptors.DescriptorQueryManager.preUpdate(DescriptorQueryManager.java:1119)
>> at
>> org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.updateObjectForWriteWithChangeSet(DatabaseQueryMechanism.java:1004)
>>  at
>> org.eclipse.persistence.queries.UpdateObjectQuery.executeCommitWithChangeSet(UpdateObjectQuery.java:84)
>> at
>> org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.executeWriteWithChangeSet(DatabaseQueryMechanism.java:287)
>>  at
>> org.eclipse.persistence.queries.WriteObjectQuery.executeDatabaseQuery(WriteObjectQuery.java:58)
>> at
>> org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:829)
>>  at
>> org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:728)
>> at
>> org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:108)
>>  at
>> org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:85)
>> at
>> org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2863)
>>  at
>> org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1501)
>> at
>> org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1483)
>>  at
>> org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1443)
>> at
>> org.eclipse.persistence.internal.sessions.CommitManager.commitChangedObjectsForClassWithChangeSet(CommitManager.java:265)
>>  at
>> org.eclipse.persistence.internal.sessions.CommitManager.commitAllObjectsForClassWithChangeSet(CommitManager.java:190)
>> at
>> org.eclipse.persistence.internal.sessions.CommitManager.commitAllObjectsWithChangeSet(CommitManager.java:136)
>>  at
>> org.eclipse.persistence.internal.sessions.AbstractSession.writeAllObjectsWithChangeSet(AbstractSession.java:3784)
>> at
>> org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabase(UnitOfWorkImpl.java:1407)
>>  at
>> org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.commitToDatabase(RepeatableWriteUnitOfWork.java:634)
>> at
>> org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1497)
>>  at
>> org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.issueSQLbeforeCompletion(UnitOfWorkImpl.java:3135)
>> at
>> org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.issueSQLbeforeCompletion(RepeatableWriteUnitOfWork.java:344)
>>  at
>> org.eclipse.persistence.transaction.AbstractSynchronizationListener.beforeCompletion(AbstractSynchronizationListener.java:157)
>> at
>> org.eclipse.persistence.transaction.JTASynchronizationListener.beforeCompletion(JTASynchronizationListener.java:68)
>>  at
>> com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:435)
>> at
>> com.sun.enterprise.transaction.JavaEETransactionManagerSimplified.commit(JavaEETransactionManagerSimplified.java:852)
>>  at
>> com.sun.enterprise.transaction.UserTransactionImpl.commit(UserTransactionImpl.java:208)
> 
> ...
>> Caused by: java.sql.SQLException: Cannot insert explicit value for
>> identity column in table 'THE_STATUS' when IDENTITY_INSERT is set to OFF.
> 
> 
> Here is the relevant part of the mapping:
> 
> @Entity
>> @EntityListeners(AuditableEntityListener.class)
>> @Table(name = "The_STATUS")
>> @XmlRootElement
>> public class TheStatus implements Serializable, Auditable
>> {
>>     private static final long serialVersionUID = 1L;
>>     @Id
>>     @Basic(optional = false)
>>     @NotNull
>>     @Column(name = "the_status_id", nullable = false)
>>     private Integer theStatusId;
> 
> ...
>> }
> 
> 
> Other details:
> 
>    - We are using EclipseLink 2.1.1
>    - The entities being inserted are from a detached cache, but I tried
>    calling EntityManager.merge on everything in the cache during the
>    transaction (just to test), and I got the same issue
>    - Not sure if it is important, but in this situation, I am explicitly
>    calling commit on a UserTransaction (class annotated
>    with @TransactionManagement(TransactionManagementType.BEAN))
> 
> 
> Shouldn't EclipseLink know that because my object has an id, it does not
> need to be inserted?  As you can see in the stack, this is happening on
> commit (I am not explicitly inserting this object).
> 
> Any idea why this is happening, or how to stop it?  Where should I look to
> figure out how to solve this?  That is, are there certain classes or
> Loggers that are of interest?
> 
> If someone would like more details, just let me know.
> 
> Any help is greatly appreciated.  Thanks,
> 
> Sean
> 
> _______________________________________________
> eclipselink-users mailing list
> eclipselink-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
> 
> 


-----
http://wiki.eclipse.org/User:James.sutherland.oracle.com James Sutherland 
http://www.eclipse.org/eclipselink/
 EclipseLink ,  http://www.oracle.com/technology/products/ias/toplink/
TopLink 
Wiki:  http://wiki.eclipse.org/EclipseLink EclipseLink , 
http://wiki.oracle.com/page/TopLink TopLink 
Forums:  http://forums.oracle.com/forums/forum.jspa?forumID=48 TopLink , 
http://www.eclipse.org/forums/index.php?t=thread&frm_id=111&S=1b00bfd151289b297688823a00683aca
EclipseLink 
Book:  http://en.wikibooks.org/wiki/Java_Persistence Java Persistence 
Blog:  http://java-persistence-performance.blogspot.com/ Java Persistence
Performance 
-- 
View this message in context: http://old.nabble.com/Fwd%3A-Entity-being-inserted-even-though-it-has-an-id--tp34097198p34119199.html
Sent from the EclipseLink - Users mailing list archive at Nabble.com.



Back to the top