Я хочу вставить файл в Oracle, используя тип столбца BLOB поверх Hibernate? - PullRequest
0 голосов
/ 07 августа 2009

Я хочу сохранить свой файл в экземпляре Oracle. Я использую Hibernate для объектов данных. Как я могу вставить файлы в Oracle Blob. Есть ли пример кода для этого?

Ответы [ 2 ]

1 голос
/ 07 августа 2009

Примечание @Lob не принадлежит Hibernate. Это javax.persistence, и вы можете использовать его в объектном компоненте с любым отображением гибернации. Да, большой файл является очевидной проблемой для такого примера. Но я не могу найти обходной путь для этого случая. FileInputStream с использованием значения типа int для представления точки смещения. Я гуглил этот с похожей проблемой: http://www.coderanch.com/t/449055/Streams/java/JAVA-HEAP-SIZE-files-byte Вы можете использовать решение с SQLPrepareSteatement, если вы используете Java 1.6. В противном случае вы можете попытаться использовать BufferedReader и каким-то образом преобразовать результаты в byteArray[] и попытаться решить другую проблему: вам потребуется столько памяти, сколько размер файла.

РЕДАКТИРОВАНИЕ: Другое дело: Oracle может добавлять данные в свои поля clob \ blob с помощью процедуры dbms_lob.writeappend (), чтобы вы могли избежать хранения всего файла в памяти, но GC будет выполнять очистку так быстро, как BufferedReader чтение из файла. И, кажется, это не спящая работа, чтобы сделать это ... jdbc и PreparedStatements снова.

1 голос
/ 07 августа 2009

Сначала вы должны аннотировать свое поле сущности аннотацией @ javax.persistance.Lob. Как это:

public class InfoMessage {

    private byte[] body;

    @Lob
    public byte[] getBody() {
        return body;
    }

    public void setBody(byte[] body) {
        this.body = body;
    }
}

и установите его с массивом байтов. Это зависит от того, какой класс файлов вы используете. Первый результат Google для java.io.File. Я думаю, что есть лучшее решение для этой операции.

public static byte[] getBytesFromFile(File file) throws IOException {
    InputStream is = new FileInputStream(file);
// Get the size of the file
long length = file.length();

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;

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...