> 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 <[EMAIL PROTECTED]> 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