You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by Sara H Waggoner <sw...@us.ibm.com> on 2008/04/14 16:18:43 UTC

IllegalArgumentException when openjpa.DetachState set to "all" or " fetch-groups(DetachedStateField=true)"

Hi,

I have some code that creates and persists an entity.  When I run the 
code, it inserts records into the database as expected, but throws the 
following error when the entity manager closes.  This exception is only 
thrown if I have 
openjpa.DetachState set to "all" or 
"fetch-groups(DetachedStateField=true)".  When I have openjpa.DetachState 
set to "loaded, it runs to completion with no exceptions.

java.lang.IllegalArgumentException
        at 
sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:63)
        at java.lang.reflect.Field.set(Field.java:656)
        at org.apache.openjpa.enhance.Reflection.set(Reflection.java:447)
        at 
org.apache.openjpa.enhance.ReflectingPersistenceCapable.setValue(ReflectingPersistenceCapable.java:350)
        at 
org.apache.openjpa.enhance.ReflectingPersistenceCapable.pcReplaceField(ReflectingPersistenceCapable.java:155)
        at 
org.apache.openjpa.kernel.StateManagerImpl.replaceField(StateManagerImpl.java:2990)
        at 
org.apache.openjpa.kernel.DetachManager$InstanceDetachFieldManager.storeObjectField(DetachManager.java:673)
        at 
org.apache.openjpa.kernel.StateManagerImpl.providedObjectField(StateManagerImpl.java:1989)
        at 
org.apache.openjpa.enhance.ReflectingPersistenceCapable.pcProvideField(ReflectingPersistenceCapable.java:114)
        at 
org.apache.openjpa.kernel.StateManagerImpl.provideField(StateManagerImpl.java:2978)
        at 
org.apache.openjpa.kernel.DetachManager$InstanceDetachFieldManager.detachField(DetachManager.java:618)
        at 
org.apache.openjpa.kernel.DetachManager$InstanceDetachFieldManager.detachFields(DetachManager.java:602)
        at 
org.apache.openjpa.kernel.DetachManager.detachInternal(DetachManager.java:448)
        at 
org.apache.openjpa.kernel.DetachManager.access$300(DetachManager.java:57)
        at 
org.apache.openjpa.kernel.DetachManager$InstanceDetachFieldManager.detachField(DetachManager.java:744)
        at 
org.apache.openjpa.kernel.DetachManager$InstanceDetachFieldManager.storeObjectField(DetachManager.java:672)
        at 
org.apache.openjpa.kernel.StateManagerImpl.providedObjectField(StateManagerImpl.java:1989)
        at 
org.apache.openjpa.enhance.ReflectingPersistenceCapable.pcProvideField(ReflectingPersistenceCapable.java:114)
        at 
org.apache.openjpa.kernel.StateManagerImpl.provideField(StateManagerImpl.java:2978)
        at 
org.apache.openjpa.kernel.DetachManager$InstanceDetachFieldManager.detachField(DetachManager.java:618)
        at 
org.apache.openjpa.kernel.DetachManager$InstanceDetachFieldManager.detachFields(DetachManager.java:602)
        at 
org.apache.openjpa.kernel.DetachManager.detachInternal(DetachManager.java:448)
        at 
org.apache.openjpa.kernel.DetachManager.detachAll(DetachManager.java:310)
        at 
org.apache.openjpa.kernel.BrokerImpl.detachAllInternal(BrokerImpl.java:3147)
        at org.apache.openjpa.kernel.BrokerImpl.free(BrokerImpl.java:4035)
        at 
org.apache.openjpa.kernel.BrokerImpl.close(BrokerImpl.java:4022)
        at 
org.apache.openjpa.kernel.DelegatingBroker.close(DelegatingBroker.java:1282)
        at 
org.apache.openjpa.persistence.EntityManagerImpl.close(EntityManagerImpl.java:1002)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at 
org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:346)
        at $Proxy23.close(Unknown Source)
        at TestNulls.test(TestNulls.java:39)
        at TestNulls.testAll(TestNulls.java:77)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at 
com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:40)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at 
com.intellij.rt.execution.application.AppMain.main(AppMain.java:90)


Here is the code:

DDL:

Create table item (
        item_id Int NOT NULL AUTO_INCREMENT,
        title Varchar(50),
        photo_id Int,
 Primary Key (item_id)) ENGINE = MyISAM;

Create table photo (
        photo_id Int NOT NULL AUTO_INCREMENT,
        bytes Blob NOT NULL,
 Primary Key (photo_id)) ENGINE = MyISAM;

Alter table item add Foreign Key (photo_id) references photo (photo_id) on 
delete  restrict on update  restrict;
Alter table item_detail add Foreign Key (item_id) references item 
(item_id) on delete  restrict on update  restrict;


persistence.xml:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">

  <persistence-unit name="mss">

 
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
    <class>net.iss.mss.jparef.services.entitynulls.Item</class>
    <class>net.iss.mss.jparef.services.entitynulls.Photo</class>

    <properties>
              <property name="openjpa.DetachState" 
value="fetch-groups(DetachedStateField=true)"/>
      <property name="openjpa.Log" value="DefaultLevel=WARN, Tool=INFO, 
SQL=TRACE"/>
      <property name="openjpa.DataCache" value="true"/>
      <property name="openjpa.RemoteCommitProvider" value="sjvm"/>
    </properties>

  </persistence-unit>
</persistence>


Item.java:

package net.iss.mss.jparef.services.entitynulls;

import java.io.*;
import javax.persistence.*;


@Entity
@Table(name = "item")
public class Item implements Serializable
{
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "item_id")
  private int id;

  @Column(name="title")
  private String title;
 
  @OneToOne(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, 
CascadeType.MERGE, CascadeType.REFRESH, CascadeType.REMOVE})
  @JoinColumn(name="photo_id", referencedColumnName="photo_id")
  private Photo photo;


  public int getId ()
  {
    return id;
  }

  public void setId (int id)
  {
    this.id = id;
  }

  public String getTitle ()
  {
    return title;
  }

  public void setTitle (String title)
  {
    this.title = title;
  }

  public Photo getPhoto ()
  {
    return photo;
  }

  public void setPhoto (Photo photo)
  {
    this.photo = photo;
  }
}


Photo.java

package net.iss.mss.jparef.services.entitynulls;

import java.io.*;
import javax.persistence.*;


@SuppressWarnings({"JpaDataSourceORMInspection"})
@Entity
@Table(name = "photo")
public class Photo implements Serializable
{
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "photo_id")
  private int id;

  @Column(name = "bytes")
  @Lob
  private Byte[] bytes;

  @OneToOne(mappedBy = "photo")
  private Item item;

  public int getId ()
  {
    return id;
  }

  public void setId (int id)
  {
    this.id = id;
  }

  public Byte[] getBytes ()
  {
    return bytes;
  }

  public void setBytes (Byte[] bytes)
  {
    this.bytes = bytes;
  }

  public Item getItem ()
  {
    return item;
  }

  public void setItem (Item item)
  {
    this.item = item;
  }
}


TestNulls.java

import java.sql.Connection;
import javax.persistence.*;
import junit.framework.*;
import org.apache.openjpa.persistence.*;
import net.iss.mss.jparef.services.entitynulls.*;
import net.iss.mss.jpa.*;


public class TestNulls extends TestCase
{
 
  private JpaContext context = new JpaContext 
("spring-artMuseumServices.xml");

  public void test () throws Exception
  {
 
    EntityManager em = null;

    try
    {
      // Create new item, set properties and object reference (photo), and 
persist

      em = context.getEmf().createEntityManager ();

      Item item = new Item();
      item.setTitle("Title 1");

      Byte[] bytes = {1, 2, 3};
      Photo photo = new Photo();
      photo.setBytes(bytes);
      item.setPhoto(photo);
      photo.setItem(item);

      em.getTransaction().begin();
      em.persist(item);
      em.getTransaction().commit();

      em.close ();


      // Null out item properties and object reference, then merge

      em = context.getEmf().createEntityManager ();

      item.setTitle(null);
      item.setPhoto(null);
      photo.setItem(null);

      em.getTransaction().begin();
      em.merge(item);
      em.getTransaction().commit();

      em.close ();
    }
    catch (Exception e)
    {
      throw e;
    }
    finally
    {
      try {
        em.close ();
        context.close ();
      }
      catch (Exception e)
      {
         //Ignore 
      }
    }
  }
}


Thanks,
Sara