You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by "Jeremy Bauer (JIRA)" <ji...@apache.org> on 2008/10/10 21:44:44 UTC
[jira] Commented: (OPENJPA-733) Entity contains pseudo-attached
embeddable after detach
[ https://issues.apache.org/jira/browse/OPENJPA-733?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12638632#action_12638632 ]
Jeremy Bauer commented on OPENJPA-733:
--------------------------------------
Here is a link to forum conversation on nabble for reference: http://n2.nabble.com/Problem-with-detaching-embedded-class-in-OpenJPA-1.2-using-compile-time-enhancement-td1117628.html
> Entity contains pseudo-attached embeddable after detach
> -------------------------------------------------------
>
> Key: OPENJPA-733
> URL: https://issues.apache.org/jira/browse/OPENJPA-733
> Project: OpenJPA
> Issue Type: Bug
> Components: kernel
> Affects Versions: 1.2.0
> Reporter: Jeremy Bauer
> Assignee: Jeremy Bauer
> Fix For: 1.2.1, 1.3.0
>
> Attachments: OPENJPA-733.patch, OPENJPA-733_smimpl.patch, OPENJPA-733_test.patch
>
>
> Problem reported by Chris Tillman on user forum and can be easily reproduced with the code provided:
> When upgrading a standalone Java application from OpenJPA 1.1 to 1.2 i ran
> into a problem regarding embedded classes.
> Accessing a field from an embedded class (say, Address) in a detached entity
> (Customer) doesn't seem to work anymore. OpenJPA 1.2 throws an
> InvalidStateException. It worked fine with OpenJPA 1.1.
> The field (street) contains the correct value as loaded from the database,
> but when the getter is used, e.g. customer.getAddress().getStreet(), the ISE
> is thrown:
> org.apache.openjpa.persistence.InvalidStateException: The context has been
> closed.
> at org.apache.openjpa.kernel.BrokerImpl.assertOpen(BrokerImpl.java:4367)
> at
> org.apache.openjpa.kernel.BrokerImpl.beginOperation(BrokerImpl.java:1766)
> at org.apache.openjpa.kernel.BrokerImpl.isActive(BrokerImpl.java:1736)
> at
> org.apache.openjpa.kernel.StateManagerImpl.beforeRead(StateManagerImpl.java:941)
> at
> org.apache.openjpa.kernel.StateManagerImpl.accessingField(StateManagerImpl.java:1476)
> at org.test.Address.pcGetstreet(Address.java)
> at org.test.Address.getStreet(Address.java:22)
> at org.test.Test.main(Test.java:30)
> Upon investigation, it seems to work OK in OpenJPA 1.2 using runtime
> enhancement (Java 6) but not using compile-time enhancement. However, in
> OpenJPA 1.1 it's the other way around.
> OpenJPA 1.1 with compile-time enhancement uses a DetachedStateManager for
> both the entity and the embeddable. As can be seen from the stacktrace,
> OpenJPA 1.2 uses a StateManagerImpl instead for the embeddable.
> Is this a regression in OpenJPA 1.2?
> Test code below:
> //-------------------------
> package org.test;
> import java.util.List;
> import javax.persistence.*;
> public class Test {
> public static void main(String[] args) {
> EntityManagerFactory factory = Persistence
> .createEntityManagerFactory("test");
> Customer customer = new Customer();
> Address address = new Address();
> customer.setLastName("Doe");
> address.setStreet("Main Street");
> customer.setAddress(address);
> try {
> persistCustomer(factory, customer);
> customer = queryCustomers(factory,
> "select customer from Customer customer" +
> " where customer.lastName = 'Doe'")
> .get(0);
> System.out.println(customer.getLastName());
> System.out.println(customer.getAddress().getStreet());
> factory.close();
> } catch (Throwable t) {
> t.printStackTrace();
> }
> }
> static void persistCustomer(EntityManagerFactory factory, Customer
> customer)
> throws Exception {
> final EntityManager em = factory.createEntityManager();
> final EntityTransaction tx = em.getTransaction();
> tx.begin();
> try {
> em.persist(customer);
> tx.commit();
> } finally {
> if (!tx.isActive()) {
> em.close();
> }
> }
> }
> public static List<Customer> queryCustomers(EntityManagerFactory factory,
> String query) throws Exception {
> final EntityManager em = factory.createEntityManager();
> final EntityTransaction tx = em.getTransaction();
> tx.begin();
> try {
> final List<Customer> list = (List<Customer>) em.createQuery(query)
> .getResultList();
> tx.commit();
> return list;
> } finally {
> if (!tx.isActive()) {
> em.close();
> }
> }
> }
> }
> //-------------------------
> package org.test;
> import javax.persistence.*;
> @Entity
> public class Customer {
> @Id @GeneratedValue long id;
> @Basic String lastName;
> @Embedded Address address;
> public String getLastName() {
> return lastName;
> }
> public void setLastName(String lastName) {
> this.lastName = lastName;
> }
> public Address getAddress() {
> return address;
> }
> public void setAddress(Address address) {
> this.address = address;
> }
> }
> //-------------------------
> package org.test;
> import javax.persistence.*;
> @Embeddable
> public class Address {
> @Basic String street;
> public String getStreet() {
> return street;
> }
> public void setStreet(String street) {
> this.street = street;
> }
> }
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.