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.