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.