2012-03-12 75 views
1

我在使用JPA将图像写入数据库时​​遇到了一些问题。我正在低于classCastexception。我也附上了代码。在将图像保存到数据库时JPA中的classcast异常

[EL Warning]: 2012-03-12 
12:02:58.757--UnitOfWork(23191477)--java.lang.ClassCastException: 
java.lang.String cannot be cast to java.lang.Number 

代码:

import javax.persistence.Basic; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Lob; 
import javax.persistence.Table; 

@Entity 
@Table(name="Horoscope_Details") 
public class HoroscopeDetails { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private long id; 
    public long getId() { 
     return id; 
    } 



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



    public String getStar() { 
     return star; 
    } 



    public void setStar(String star) { 
     this.star = star; 
    } 



    public byte[] getPicture() { 
     return picture; 
    } 



    public void setPicture(byte[] picture) { 
     this.picture = picture; 
    } 



    private String star; 

    @Lob @Basic(fetch = FetchType.LAZY) 
    @Column(length=1048576) 
    private byte[] picture; 





} 




package main; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

import javax.persistence.EntityManager; 

import com.vemanchery.timesheet.emf.EMF; 
import com.vemanchery.timesheet.model.HoroscopeDetails; 

public class Main2 { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     // save image into database 
     File file = new File("C:\\images\\1.jpg"); 
     byte[] bFile = null;; 
     try { 
      bFile = readImageOldWay(file); 
     } catch (IOException e1) { 

      e1.printStackTrace(); 
     } 

    /* try { 
      FileInputStream fileInputStream = new FileInputStream(file); 
      // convert file into array of bytes 
      fileInputStream.read(bFile); 
      fileInputStream.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     }*/ 

     EntityManager entityManager = EMF.getEntityManager(); 
     entityManager.getTransaction().begin(); 
     HoroscopeDetails horoscopeDetails = new HoroscopeDetails(); 
     horoscopeDetails.setPicture(bFile); 
     horoscopeDetails.setStar("lll"); 
     System.out.println("done!!"); 
     entityManager.persist(horoscopeDetails); 
     entityManager.getTransaction().commit(); 
     entityManager.flush(); 
     entityManager.close(); 

    } 

    public static byte[] readImageOldWay(File file) throws IOException { 
     Logger.getLogger(Main.class.getName()).log(Level.INFO, 
       "[Open File] " + file.getAbsolutePath()); 
     InputStream is = new FileInputStream(file); 
     // Get the size of the file 
     long length = file.length(); 
     // You cannot create an array using a long type. 
     // It needs to be an int type. 
     // Before converting to an int type, check 
     // to ensure that file is not larger than Integer.MAX_VALUE. 
     if (length > Integer.MAX_VALUE) { 
      // File is too large 
     } 
     // Create the byte array to hold the data 
     byte[] bytes = new byte[(int) length]; 
     // Read in the bytes 
     int offset = 0; 
     int numRead = 0; 
     while (offset < bytes.length 
       && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) { 
      offset += numRead; 
     } 
     // Ensure all the bytes have been read in 
     if (offset < bytes.length) { 
      throw new IOException("Could not completely read file " 
        + file.getName()); 
     } 
     // Close the input stream and return bytes 
     is.close(); 
     return bytes; 
    } 

} 

我得到了以下异常。

[EL Warning]: 2012-03-12 13:41:33.672--UnitOfWork(23667197)--java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Number 
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Number 
    at org.eclipse.persistence.sequencing.QuerySequence.updateAndSelectSequence(QuerySequence.java:278) 
    at org.eclipse.persistence.sequencing.StandardSequence.getGeneratedVector(StandardSequence.java:71) 
    at org.eclipse.persistence.sequencing.DefaultSequence.getGeneratedVector(DefaultSequence.java:163) 
    at org.eclipse.persistence.sequencing.Sequence.getGeneratedVector(Sequence.java:257) 
    at org.eclipse.persistence.internal.sequencing.SequencingManager$Preallocation_Transaction_NoAccessor_State.getNextValue(SequencingManager.java:468) 
    at org.eclipse.persistence.internal.sequencing.SequencingManager.getNextValue(SequencingManager.java:1067) 
    at org.eclipse.persistence.internal.sequencing.ClientSessionSequencing.getNextValue(ClientSessionSequencing.java:70) 
    at org.eclipse.persistence.internal.descriptors.ObjectBuilder.assignSequenceNumber(ObjectBuilder.java:349) 
    at org.eclipse.persistence.internal.descriptors.ObjectBuilder.assignSequenceNumber(ObjectBuilder.java:308) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.assignSequenceNumber(UnitOfWorkImpl.java:465) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerNotRegisteredNewObjectForPersist(UnitOfWorkImpl.java:4231) 
    at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.registerNotRegisteredNewObjectForPersist(RepeatableWriteUnitOfWork.java:513) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerNewObjectForPersist(UnitOfWorkImpl.java:4176) 
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.persist(EntityManagerImpl.java:440) 
    at main.Main2.main(Main2.java:48) 
+0

你能发布的整个堆栈跟踪错误不只是消息? – 2012-03-12 08:09:15

+0

编辑我的问题并添加了错误的堆栈跟踪。 – user414967 2012-03-12 08:13:26

+0

这很奇怪。看来eclipse链接不能为id列生成下一个值。你使用的是什么数据库?如何将'long'改为'Long'? – 2012-03-12 08:36:04

回答

0

java.lang.String中不能转换到java.lang.Number中

你的映射可能是错的。您在您的交易(setStar("lll"))只设定一个字符串,持久层尝试这个字符串转换为数值。也许你的列数据类型是数字格式?

如果该值不应该坚持,你应该明确地使用@Transient注解同场

UPDATE:如果你想知道的JPA生成的SQL,以下内容添加到您的的persistence.xml<persistence-unit>的元素:

<properties> 
     property name="eclipselink.logging.level.sql" value="FINE" /> 
</properties> 
+0

不,那不是错误。我删除了该属性并尝试运行。仍然得到相同的错误。我认为这是字节[]的问题。我不知道那有什么问题。你有任何运行代码吗? – user414967 2012-03-12 08:28:58

+0

您可以配置它记录所有SQL语句的eclipselink。更新了我的答案。 – 2012-03-12 08:32:31

+0

Yaa我遇到了问题。主键自动生成值的问题。现在它工作正常。谢谢 – user414967 2012-03-12 08:39:23