私は、ユーザーが自分の履歴書を PDF 形式でアップロードできる Web アプリケーションを開発しています。NHibernate をデータ マッパーとして使用し、MS SQL SERVER 2005 を使用しています。
.pdf ファイルを特定のテーブルに保存できるようにしたい...何かアイデアはありますか?
どうもありがとうございました!
私は、ユーザーが自分の履歴書を PDF 形式でアップロードできる Web アプリケーションを開発しています。NHibernate をデータ マッパーとして使用し、MS SQL SERVER 2005 を使用しています。
.pdf ファイルを特定のテーブルに保存できるようにしたい...何かアイデアはありますか?
どうもありがとうございました!
「オリジナル」の Java Hibernate3 でまさにそれを行っています。持続可能クラスのバイト配列プロパティをタイプ「画像」の列にマップするだけです。
package com.hibernate.pdf.sample;
public class TPDFDocument implements java.io.Serializable {
private Integer pdfDocumentId;
private byte[] document;
public Integer getPdfDocumentId() {
return this.pdfDocumentId;
}
public void setPdfDocumentId(Integer pdfDocumentId) {
this.pdfDocumentId = pdfDocumentId;
}
public byte[] getDocument() {
return this.document;
}
public void setDocument(byte[] document) {
this.document = document;
}
}
休止状態のマッピング:
<hibernate-mapping>
<class name="com.hibernate.pdf.sample.TPDFDocument" table="T_PDFDocument">
<id name="pdfDocumentId" type="integer">
<column name="pdfDocumentId" />
<generator class="identity" />
</id>
<property name="document" type="binary">
<column name="document" not-null="true" />
</property>
</class>
</hibernate-mapping>
テーブルの作成:
CREATE TABLE [dbo].[T_PDFDocument](
[pdfDocumentId] [int] IDENTITY(1,1) NOT NULL,
[document] [image] NOT NULL,
CONSTRAINT [PK_PDFDocument] PRIMARY KEY CLUSTERED
(
[pdfDocumentId] ASC
)
ドキュメントの raw バイトを配列に読み込んで永続化するだけです。私たちの状況では、ドキュメントは 1MB よりもほとんど大きくならないため、すべてをバイト配列に入れてもパフォーマンスの問題は発生しません。おそらく、このソリューションは非常に大きなドキュメントには適していません。
NHibernate の実装と C# を使用すると、ソリューションは非常に似ていると思います。
INSERT INTO テーブル (DocumentId、PDF) 値 (newid()、0x12345667)
ここで、16 進数の定数は、16 進数でエンコードされた PDF のバイトストリームです。
誰かがより良い方法を見つけることができると確信していますが、これは私には明らかです。
PDFをテーブルに入れる必要がある理由は何ですか? ファイルをファイルシステムに保存し、ID で参照できます。これにより、SQL Server のスペースを節約できます。とにかく、バイナリデータにインデックスを付けることができるとは思いません。