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