These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 
Author Message
 Post subject: Blob problem ONLY when using joined subclass
PostPosted: Tue Oct 20, 2009 7:02 am 
Newbie

Joined: Fri Aug 14, 2009 8:06 am
Posts: 19
I have implemented a subclass ImageBlob of BlobImpl in order to store images in the db. This works perfectly if I map the class containing this blob with <class>. However, since most of my persistent classes are subclasses of PersistentObject I wanted to map it as a <joined-subclasss> as soon as I do that however I get an exception when saving the object saying that I can not manipulate a blob outside a session.

But the session is till open at the moment of the save! Anyway, what's the difference? In my opinion behaviour should be the same but nope :(

Here is the code:
Code:
session.beginTransaction();

Exercise exercise = ExerciseFactory.getNewExercise();

DataItem variantDataItem = Data.VARIANT.add("variant");
exercise.addVariant(variantDataItem);

Variant variant = exercise.getVariant(variantDataItem);
BufferedImage image;

variant.setAssignment("assignment");
variant.setStartPositionDetail("startPositionDetail");
variant.setType(VariantType.ASSIGNMENT);
image = variant.getImage(); // if the variant does not yet have an image the default image is loaded from file.

exercise.save(); // this saves the variant too and generates the error.
session.getTransaction().commit();


The ImageBlob class:
Code:
public class ImageBlob extends BlobImpl {

   public ImageBlob(Blob blob) throws SQLException {
      super(blob.getBytes(1, (int) blob.length())); // This is where it goes wrong!! ... well, when using <joined-subclass>, not when using <class>
   }

   public ImageBlob(BufferedImage image) {
      super(getBytes(image));
   }

   public BufferedImage getImage() {
      try {
         return ImageIO.read(getBinaryStream());
      }
      catch (IOException exception) {
         // TODO Auto-generated catch block
         exception.printStackTrace();

         return null;
      }
      catch (SQLException exception) {
         // TODO Auto-generated catch block
         exception.printStackTrace();

         return null;
      }
   }

   public void setImage(BufferedImage image) {
      try {
         setBytes(1L, getBytes(image));
      }
      catch (SQLException exception) {
         // TODO Auto-generated catch block
         exception.printStackTrace();
      }
   }

   public static byte[] getBytes(BufferedImage image) {
      try {
         ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

         ImageIO.write(image, "jpg", byteArrayOutputStream);
         byteArrayOutputStream.flush();

         return byteArrayOutputStream.toByteArray();
      }
      catch (IOException exception) {
         // TODO Auto-generated catch block
         exception.printStackTrace();

         return null;
      }
   }
}


The <joined-subclass> mapping file (this one does NOT work)
Code:
<hibernate-mapping package="be.bloso.vetrasoft.model.exercise">
   <joined-subclass name="Variant"
      extends="be.bloso.vetrasoft.model.PersistentObject"
      table="VARIANT">

      <key column="id" />
         
      <property name="startPositionDetail" />
      <property name="assignment" />
      <property name="standard" />
      <property name="type" />   
      <property name="imageBlob" type="blob" lazy="true" />

      <many-to-one name="parent" class="ExerciseImpl" fetch="select" />
      <many-to-one name="variantDataItem"   class="be.bloso.vetrasoft.model.application.DataItem" fetch="select" />
            
   </joined-subclass>
</hibernate-mapping>


The <class> version. This one DOES work
Code:
<hibernate-mapping package="be.bloso.vetrasoft.model.exercise">
   <class name="Variant" table="VARIANT">

      <id name="id" column="DATAITEM_ID">
         <generator class="hilo" />
      </id>
         
      <property name="startPositionDetail" />
      <property name="assignment" />
      <property name="standard" />
      <property name="type" />   
      <property name="imageBlob" type="blob" lazy="true" />   

      <many-to-one name="parent" class="ExerciseImpl" fetch="select" />
      <many-to-one name="variantDataItem"   class="be.bloso.vetrasoft.model.application.DataItem" fetch="select" />
            
   </class>
</hibernate-mapping>


The stack trace:
Code:
org.hibernate.PropertyAccessException: Exception occurred inside setter of be.bloso.vetrasoft.model.exercise.Variant.imageBlob
   at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:89)
   at org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:352)
   at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:232)
   at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:3580)
   at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:300)
   at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
   at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:144)
   at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
   at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
   at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117)
   at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
   at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:535)
   at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:527)
   at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:523)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:342)
   at $Proxy7.saveOrUpdate(Unknown Source)
   at be.bloso.vetrasoft.model.PersistentObject.save(PersistentObject.java:57)
   at be.bloso.vetrasoft.model.exercise.Variant.save(Variant.java:84)
   at be.bloso.vetrasoft.model.exercise.ExerciseImpl.save(ExerciseImpl.java:91)
   at be.bloso.vetrasoft.model.application.DatabaseTest.testVariant(DatabaseTest.java:272)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
   at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
   at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
   at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
   at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
   at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
   at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:73)
   at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46)
   at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)
   at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)
   at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)
   at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
   at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
   at org.junit.runners.ParentRunner.run(ParentRunner.java:220)
   at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
   at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
   at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
   at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
   at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
   at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.reflect.InvocationTargetException
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:66)
   ... 47 more
Caused by: java.lang.UnsupportedOperationException: Blob may not be manipulated from creating session
   at org.hibernate.lob.BlobImpl.excep(BlobImpl.java:127)
   at org.hibernate.lob.BlobImpl.getBytes(BlobImpl.java:73)
   at be.bloso.vetrasoft.model.application.ImageBlob.<init>(ImageBlob.java:25)
   at be.bloso.vetrasoft.model.exercise.Variant.setImageBlob(Variant.java:204)
   ... 52 more


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.