You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@openjpa.apache.org by jc222 <jc...@free.fr> on 2008/12/16 23:31:12 UTC
Transient field with @ManagedInterface
Hi all,
Always my pb of managed interface and transient field.
I really don't know how to do the job ...
Can anybody help me ?
Here is the full example (first the interfaces, then the implementation
classes , the main test class, the presistence.xml and the exception.....
---------------------------------------------------------
Param.java:
package tt;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import org.apache.openjpa.persistence.ManagedInterface;
@ManagedInterface
@Embeddable
public interface Param {
void setValue(int value);
@Column(name = "value")
int getValue();
}
--------------------------------------------------------
Base.java:
package tt;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import org.apache.openjpa.persistence.ManagedInterface;
@ManagedInterface
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public interface Base {
void setId(long id);
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
long getId();
}
---------------------------------------------------------------
Thing.java
package tt;
import javax.persistence.AttributeOverride;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Transient;
import org.apache.openjpa.persistence.ManagedInterface;
@ManagedInterface
@Entity
@Table(name = "if")
public interface Thing extends Base {
void setName(String name);
String getName();
void setParam(Param param);
@Embedded
@AttributeOverride(name = "value", column = @Column(name = "param1"))
Param getParam();
@Transient
int getFoo();
void setFoo(int foo);
}
----------------------------------------------
ParamImpl .java:
package ttimpl;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import tt.Param;
@Embeddable
public class ParamImpl implements Param {
protected int value;
@Override
@Column(name = "value")
public int getValue() {
return value;
}
@Override
public void setValue(int value) {
this.value = value;
}
}
-------------------------------------------------
BaseImpl.java:
package ttimpl;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import tt.Base;
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class BaseImpl implements Base {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
protected long id;
@Override
public long getId() {
return id;
}
@Override
public void setId(long id) {
this.id = id;
}
}
-----------------------------------------
ThingImpl.java
package ttimpl;
import javax.persistence.AttributeOverride;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.Table;
import tt.Param;
import tt.Thing;
@Entity
@Table(name = "thing")
public class ThingImpl extends BaseImpl implements Thing {
protected String name;
@Embedded
@AttributeOverride(name = "value", column = @Column(name = "param1"))
protected Param param;
protected int foo;
@Override
public String getName() {
return name;
}
@Override
public Param getParam() {
return param;
}
@Override
public void setName(String name) {
this.name = name;
}
@Override
public void setParam(Param param) {
this.param = param;
}
@Override
public int getFoo() {
return foo;
}
@Override
public void setFoo(int foo) {
this.foo = foo;
}
}
----------------------------------------------
Main.java:
package ttimpl;
import java.util.logging.Logger;
import javax.persistence.Query;
import org.apache.openjpa.persistence.OpenJPAEntityManager;
import org.apache.openjpa.persistence.OpenJPAEntityManagerFactory;
import org.apache.openjpa.persistence.OpenJPAPersistence;
import tt.Param;
import tt.Thing;
public class Main {
/**
* logger de la classe
*/
private static Logger _logger = Logger.getLogger("tt");
/**
* @param args
*/
public static void main(String[] args) {
_logger.info("begin");
EntityManagerFactory factory =
Persistence.createEntityManagerFactory("tt", System.getProperties());
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Thing thing = new ThingImpl();
thing.setName("thing");
thing.setParam(new ParamImpl());
thing.getParam().setValue(12);
thing.setFoo(45);
em.persist(thing);
em.getTransaction().commit();
em.close();
_logger.info("end");
}
}
-------------------------------------------------------------
Persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
<persistence-unit name="tt" transaction-type="RESOURCE_LOCAL">
<provider>
org.apache.openjpa.persistence.PersistenceProviderImpl
</provider>
<mapping-file>reversemapping/orm.xml</mapping-file>
<class>tt.Thing</class>
<class>tt.Param</class>
<class>tt.Base</class>
<class>ttimpl.ThingImpl</class>
<class>ttimpl.ParamImpl</class>
<class>ttimpl.BaseImpl</class>
<properties>
<property name="openjpa.ConnectionURL"
value="jdbc:derby:openjpa-database;create=true" />
<property name="openjpa.ConnectionDriverName"
value="org.apache.derby.jdbc.EmbeddedDriver" />
<property name="openjpa.ConnectionUserName" value="user" />
<property name="openjpa.ConnectionPassword" value="secret" />
<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema" />
</properties>
</persistence-unit>
</persistence>
----------------------------------------------------------------------
StrackTrace:
16 déc. 2008 22:44:18 ttimpl.Main main
INFO: begin
55 tt INFO [main] openjpa.Runtime - Starting OpenJPA 1.2.0
148 tt INFO [main] openjpa.jdbc.JDBC - Using dictionary class
"org.apache.openjpa.jdbc.sql.DerbyDictionary".
1605 tt INFO [main] openjpa.Enhance - Creating subclass for "[class
ttimpl.ParamImpl, class ttimpl.ThingImpl, class ttimpl.BaseImpl]". This
means that your application will be less efficient and will consume more
memory than it would if you ran the OpenJPA enhancer. Additionally, lazy
loading will not be available for one-to-one and many-to-one persistent
attributes in types using field access; they will be loaded eagerly instead.
Exception in thread "main" <openjpa-1.2.0-r422266:683325 fatal store error>
org.apache.openjpa.persistence.RollbackException:
org.apache.openjpa.enhance.ReflectingPersistenceCapable cannot be cast to
tt.Param$21565531openjpaimpl
at
org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:523)
at ttimpl.Main.main(Main.java:66)
Caused by: <openjpa-1.2.0-r422266:683325 nonfatal general error>
org.apache.openjpa.persistence.PersistenceException:
org.apache.openjpa.enhance.ReflectingPersistenceCapable cannot be cast to
tt.Param$21565531openjpaimpl
at org.apache.openjpa.kernel.BrokerImpl.embed(BrokerImpl.java:2703)
at
org.apache.openjpa.kernel.SingleFieldManager.embed(SingleFieldManager.java:846)
at
org.apache.openjpa.kernel.SingleFieldManager.preFlush(SingleFieldManager.java:588)
at
org.apache.openjpa.kernel.SingleFieldManager.preFlush(SingleFieldManager.java:562)
at
org.apache.openjpa.kernel.SingleFieldManager.preFlush(SingleFieldManager.java:478)
at
org.apache.openjpa.kernel.StateManagerImpl.preFlush(StateManagerImpl.java:2828)
at org.apache.openjpa.kernel.PNewState.beforeFlush(PNewState.java:39)
at
org.apache.openjpa.kernel.StateManagerImpl.beforeFlush(StateManagerImpl.java:959)
at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1948)
at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:1908)
at
org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:1826)
at
org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:81)
at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1350)
at
org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:877)
at
org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:512)
... 1 more
Caused by: java.lang.ClassCastException:
org.apache.openjpa.enhance.ReflectingPersistenceCapable cannot be cast to
tt.Param$21565531openjpaimpl
at tt.Param$21565531openjpaimpl.pcCopyFields(Unknown Source)
at org.apache.openjpa.kernel.BrokerImpl.embed(BrokerImpl.java:2681)
... 15 more
--
View this message in context: http://n2.nabble.com/Transient-field-with-%40ManagedInterface-tp1665281p1665281.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.