You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by "Das, Aditi" <Ad...@schwab.com> on 2007/08/20 02:51:12 UTC

Does embedded class works only with enhancer?

Hi,
 
I have a entity and a emdeddable class as below.
================================================
@Entity(name = "ARTICLE")
public class Article  implements Cloneable,Serializable{
      @Id
     @GeneratedValue(strategy=GenerationType.AUTO)
     private long id;
 
     @Embedded
     private Content content;
 
     @Version
     @Column(name = "VER")
     private long version;
}
 
@Embeddable
public class Content {
     @Lob
     private String content;
 
     public String getContent() {
          return content;
     }
 
     public void setContent(String content) {
          this.content = content;
     }
}
======================================================
 
When I run the below code with enhancer, everything works fine,
==========================================================
  tx.begin();
  Article article =  em.find(Article.class,11);
  article.getContent().setContent("Once upon a time there is a city of
Hamelin!!!");
  tx.commit();
=================================================================
 
But without enhancer, it gives me the below error.
 
------------------------------------------------------------------------
----------------------------------------------------------
Exception in thread "main" <openjpa-0.0.0-runknown fatal store error>
org.apache.openjpa.persistence.RollbackException: no-saved-fields
 at
org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImp
l.java:420)
 at jpa.ArticleTest.main(ArticleTest.java:24)
Caused by: <openjpa-0.0.0-runknown fatal general error>
org.apache.openjpa.persistence.PersistenceException: no-saved-fields
 at
org.apache.openjpa.kernel.StateManagerImpl.dirtyCheck(StateManagerImpl.j
ava:799)
 at
org.apache.openjpa.kernel.BrokerImpl$ManagedCache.dirtyCheck(BrokerImpl.
java:4649)
 at
org.apache.openjpa.kernel.BrokerImpl$ManagedCache.access$0(BrokerImpl.ja
va:4644)
 at
org.apache.openjpa.kernel.BrokerImpl.hasTransactionalObjects(BrokerImpl.
java:3767)
 at org.apache.openjpa.kernel.BrokerImpl.setDirty(BrokerImpl.java:3884)
 at
org.apache.openjpa.kernel.StateManagerImpl.setPCState(StateManagerImpl.j
ava:207)
 at
org.apache.openjpa.kernel.StateManagerImpl.dirty(StateManagerImpl.java:1
533)
 at
org.apache.openjpa.kernel.StateManagerImpl.dirty(StateManagerImpl.java:1
472)
 at
org.apache.openjpa.kernel.StateManagerImpl.dirtyCheck(StateManagerImpl.j
ava:809)
 at
org.apache.openjpa.kernel.BrokerImpl$ManagedCache.dirtyCheck(BrokerImpl.
java:4649)
 at
org.apache.openjpa.kernel.BrokerImpl$ManagedCache.access$0(BrokerImpl.ja
va:4644)
 at
org.apache.openjpa.kernel.BrokerImpl.hasTransactionalObjects(BrokerImpl.
java:3767)
 at
org.apache.openjpa.kernel.BrokerImpl.getTransactionalStates(BrokerImpl.j
ava:3756)
 at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1898)
 at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:1879)
 at
org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:17
97)
 at
org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime
.java:81)
 at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1327)
 at
org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:
866)
 at
org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImp
l.java:409)
 ... 1 more
------------------------------------------------------------------------
-----------------------------------------------------------------
 
When I traced back, I found the below code in BrokerImpl(kernel package)
where the embadable stateManager is getting added to the _untracked.
 
       public void add(StateManagerImpl sm) {
            if (!sm.isIntercepting()){
                if (_untracked == null)
                    _untracked = new HashSet();
                _untracked.add(sm);
            }
            ....................
     }
 
If I change the above code to , everything works fine..
 
         public void add(StateManagerImpl sm) {
            if (!sm.isIntercepting() && !sm.isEmbedded()) {
                if (_untracked == null)
                    _untracked = new HashSet();
                _untracked.add(sm);
            }
            ....................
     }
 
 
Not sure whether it is a feature of enhancer or a bug..Or am I missing
out any annotation/property etc.?
 
 
Please let me know,
Aditi
 
 

Re: Does embedded class works only with enhancer?

Posted by Patrick Linskey <pl...@gmail.com>.
>          public void add(StateManagerImpl sm) {
>             if (!sm.isIntercepting() && !sm.isEmbedded()) {

That change would only mask the problem, not fix it -- evidently,
embedded types are not being tracked properly in the unenhanced
pathways. Not adding them would mean that changes you made to such
instances would be undetected.

-Patrick

On 8/19/07, Das, Aditi <Ad...@schwab.com> wrote:
> Hi,
>
> I have a entity and a emdeddable class as below.
> ================================================
> @Entity(name = "ARTICLE")
> public class Article  implements Cloneable,Serializable{
>       @Id
>      @GeneratedValue(strategy=GenerationType.AUTO)
>      private long id;
>
>      @Embedded
>      private Content content;
>
>      @Version
>      @Column(name = "VER")
>      private long version;
> }
>
> @Embeddable
> public class Content {
>      @Lob
>      private String content;
>
>      public String getContent() {
>           return content;
>      }
>
>      public void setContent(String content) {
>           this.content = content;
>      }
> }
> ======================================================
>
> When I run the below code with enhancer, everything works fine,
> ==========================================================
>   tx.begin();
>   Article article =  em.find(Article.class,11);
>   article.getContent().setContent("Once upon a time there is a city of
> Hamelin!!!");
>   tx.commit();
> =================================================================
>
> But without enhancer, it gives me the below error.
>
> ------------------------------------------------------------------------
> ----------------------------------------------------------
> Exception in thread "main" <openjpa-0.0.0-runknown fatal store error>
> org.apache.openjpa.persistence.RollbackException: no-saved-fields
>  at
> org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImp
> l.java:420)
>  at jpa.ArticleTest.main(ArticleTest.java:24)
> Caused by: <openjpa-0.0.0-runknown fatal general error>
> org.apache.openjpa.persistence.PersistenceException: no-saved-fields
>  at
> org.apache.openjpa.kernel.StateManagerImpl.dirtyCheck(StateManagerImpl.j
> ava:799)
>  at
> org.apache.openjpa.kernel.BrokerImpl$ManagedCache.dirtyCheck(BrokerImpl.
> java:4649)
>  at
> org.apache.openjpa.kernel.BrokerImpl$ManagedCache.access$0(BrokerImpl.ja
> va:4644)
>  at
> org.apache.openjpa.kernel.BrokerImpl.hasTransactionalObjects(BrokerImpl.
> java:3767)
>  at org.apache.openjpa.kernel.BrokerImpl.setDirty(BrokerImpl.java:3884)
>  at
> org.apache.openjpa.kernel.StateManagerImpl.setPCState(StateManagerImpl.j
> ava:207)
>  at
> org.apache.openjpa.kernel.StateManagerImpl.dirty(StateManagerImpl.java:1
> 533)
>  at
> org.apache.openjpa.kernel.StateManagerImpl.dirty(StateManagerImpl.java:1
> 472)
>  at
> org.apache.openjpa.kernel.StateManagerImpl.dirtyCheck(StateManagerImpl.j
> ava:809)
>  at
> org.apache.openjpa.kernel.BrokerImpl$ManagedCache.dirtyCheck(BrokerImpl.
> java:4649)
>  at
> org.apache.openjpa.kernel.BrokerImpl$ManagedCache.access$0(BrokerImpl.ja
> va:4644)
>  at
> org.apache.openjpa.kernel.BrokerImpl.hasTransactionalObjects(BrokerImpl.
> java:3767)
>  at
> org.apache.openjpa.kernel.BrokerImpl.getTransactionalStates(BrokerImpl.j
> ava:3756)
>  at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1898)
>  at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:1879)
>  at
> org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:17
> 97)
>  at
> org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime
> .java:81)
>  at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1327)
>  at
> org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:
> 866)
>  at
> org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImp
> l.java:409)
>  ... 1 more
> ------------------------------------------------------------------------
> -----------------------------------------------------------------
>
> When I traced back, I found the below code in BrokerImpl(kernel package)
> where the embadable stateManager is getting added to the _untracked.
>
>        public void add(StateManagerImpl sm) {
>             if (!sm.isIntercepting()){
>                 if (_untracked == null)
>                     _untracked = new HashSet();
>                 _untracked.add(sm);
>             }
>             ....................
>      }
>
> If I change the above code to , everything works fine..
>
>          public void add(StateManagerImpl sm) {
>             if (!sm.isIntercepting() && !sm.isEmbedded()) {
>                 if (_untracked == null)
>                     _untracked = new HashSet();
>                 _untracked.add(sm);
>             }
>             ....................
>      }
>
>
> Not sure whether it is a feature of enhancer or a bug..Or am I missing
> out any annotation/property etc.?
>
>
> Please let me know,
> Aditi
>
>
>


-- 
Patrick Linskey
202 669 5907