java - 将图像保存到数据库时JAVA中的classcastException

标签 java jpa eclipselink

当我使用 JPA 将图像写入数据库时​​遇到一些问题。我正在低于 ClasscastException 。我也附上了代码。

[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)

最佳答案

java.lang.String cannot be cast to java.lang.Number

您的映射可能是错误的。您在事务中仅设置了一个字符串( setStar("lll")) 。持久层尝试将此字符串转换为数字。也许您的列数据类型是数字格式?

如果不应保留该值,则应明确使用 @Transient字段注释。

更新:如果您想了解 JPA 生成的 SQL,请将以下内容添加到 <persistence-unit> 内的 persistence.xml 中元素:

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

关于java - 将图像保存到数据库时JAVA中的classcastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9662719/

相关文章:

java - 从 JPA 2.1 升级到 JPA 2.2

java - JPA 2.1 应用程序在重新部署到 WebLogic 12.2.1 时需要重新启动托管服务器

java - 如何验证Java中的内存泄漏

JPA : @SequenceGenerator is not generating the sequence

java - JPQL 未给出结果

java - JBoss - EntityManager 注入(inject)失败

java - SQLResultSetMapping 在空列的情况下抛出异常

java - map 值在数组中。所有值都需要转换为列表并将所有值组合为结果列表

java - ejb 客户端的 POM 配置抛出异常

java - 在重复的布局上滚动 - Android