2012-03-12 2 views
1

JPA를 사용하여 데이터베이스에 이미지를 쓸 때 몇 가지 문제가 있습니다. 나는 클래스 캐스팅 예외 아래에있다. 나는 코드도 첨부했다.이미지를 데이터베이스에 저장하는 동안 JPA에서 클래스 캐스팅 예외가 발생했습니다.

[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

당신이 전체 스택 트레이스를 게시 할 수 없습니다 : 당신은 JPA에 의해 생성 된 SQL을 알고 싶은 경우, <persistence-unit> 요소 내에 귀하의 의 persistence.xml 다음을 추가 오류 메시지뿐만 아니라? –

+0

내 질문을 편집하고 오류의 스택 추적을 추가했습니다. – user414967

+0

이상합니다. 이클립스 링크는 id 컬럼의 다음 값을 생성 할 수 없다. 당신이 사용하는 데이터베이스는 무엇입니까? 'long'을'Long'으로 바꾸는 것은 어떻습니까? –

답변

0

java.lang.String의가 잘못 될 수 귀하의 매핑

상위를

으로 캐스팅 할 수 없습니다. 당신은 당신의 거래 ( setStar("lll"))에서 하나의 문자열을 설정합니다. 지속성 계층은 번호에이 문자열을 캐스팅하려고합니다. 어쩌면 당신의 열 데이터 유형은 숫자 형식입니다? 값이 지속되어서는 안 경우

당신은 명시 적으로 @Transient 주석을 사용한다 분야와

UPDATE :.

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

번호는 오류가 아닙니다. 해당 속성을 제거하고 실행을 시도했습니다. 여전히 같은 오류가 발생합니다. 나는 그것이 바이트 []와 함께 문제라고 생각한다. 나는 그게 무슨 잘못인지 모르겠다. 실행중인 코드가 있습니까? – user414967

+0

모든 SQL 문을 기록하도록 eclipselink를 구성 할 수 있습니다. 내 대답이 업데이트되었습니다. –

+0

예. 문제가 있습니다. 기본 키 자동 생성 값의 문제점. 이제 제대로 작동합니다. 감사 – user414967

관련 문제