2017-07-11 2 views
0

byte[]フィールドをデータベースではなくローカルファイルシステムに保存しようとしています。JPAはデータベースではなくファイルシステムである

私はエンティティを永続化した後、私は、例えばのために、JPAの注釈に@Transient

@Entity 
@Table(name = "screenshot") 
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
public class Screenshot implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") 
    @SequenceGenerator(name = "sequenceGenerator") 
    private Long id; 

    @Lob 
    @Transient 
    @Column(name = "image", nullable = false) 
    private byte[] image; 

    @Column(name = "otherField", nullable = false) 
    private String otherField; 

    @Column(name = "otherField2", nullable = false) 
    private String otherField2; 
} 

を試みたが、しています@Transient注釈のため、returnedEntityimageプロパティは返されません。

Screenshot returnedEntity = screenshotRepository.save(entity); 

しかし、私はインオーダーユニークIDを取得し、私のローカルのファイルシステムにのみ画像(バイナリ)フィールドを永続化するファイルパスの一部として、このIDを使用するには、最初のデータベースに永続化する必要があります。

エンティティをデータベースに保存する前に、固有のIDを持っていないという状況が発生しました。しかし、エンティティを保存した後、ローカルファイルシステムにファイルを保存するためにバイナリバイト[]データを失いました。

保存されたIDをバイナリバイト[]にリンクするのに適していないようです。

+0

イメージデータが失われたということはどういう意味ですか?それはデータベースに保存されたかどうか?もしあなたがそれを保存したテーブルから戻ってくるのを止めるのは誰ですか?なぜ画像を@Idとマークしましたか? screenshotRepository.saveとは何ですか? (実装を示す) – CrazySabbath

+0

'@ id'はタイプミスで編集しました。いいえ、データベースに保存するのではなく、ローカルのファイルシステムに保存します。 –

+0

エンティティをデータベースに保存する前に、私は一意のIDを持っていないという状況に遭遇しました。しかし、私はエンティティ 'を保存した後。エンティティを永続させたくない場合は、なぜJPAを使用していますか?あなたのテーブルとそのデータを表示します。 – CrazySabbath

答えて

0

問題は、フィールドをTransientedにして、シリアル化して(シリアル化して)、sametimeにすることです。一部の人々は、@ 012Cのような@JsonIncludeアノテーションを使用することを提案しています。

しかし、私の見地からは、というアイデアは、あなたのアプリのロジックにあり、JPAとは関係ありません。だから、私はオブジェクトをコピーする前にコピーするか、少なくともイメージフィールドだけをコピーします。既存のものの後、コピーされたオブジェクトのIDに既存のオブジェクトのIDを割り当てます。

または、別の解決策として、画像にパスを格納する文字列フィールドをデータベースに追加することができます。まず、イメージを「心臓のコンテンツ」やどこに書いてから、イメージのパスをエンティティに割り当て、そのパスをデータベースに保持します。

また、エンティティレイヤーの上にシステムに別のデータモデルレイヤーを追加することもできます。エンティティレイヤーにはJSONクラスが含まれているため、エンティティやJSONアノテーションに一時フィールドを入れる必要はありません。

+0

'@ JsonInclude'アノテーションは実際には必要ありません。フィールドはまだJSONとして解析されています。ローカルファイルシステム上の一時フォルダに 'blob'フィールドを永続させ、新しい' filepath'フィールドを作成し、それを割り当ててからエンティティを自分のDBに永続させました。今は私のローカルファイルシステムのブロブとDBのエントリの関係があり、tempファイルパスを自分のハートの内容に移動することで実際のファイル構造を改善することができます –

+0

私はちょうど私の答えを更新しました。 –

関連する問題