1

ReferenceItems の AutoPopulatingList を含む ReferenceForm というエンティティがあります。次のようになります。

@Entity
public class ReferenceForm implements Serializable{

    private static final long serialVersionUID = -5633788166190438576L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    long id;


    @lob
    private AutoPopulatingList<ReferenceItem> referenceItems;

}

AutoPopulatingList に注釈をまったく追加しない場合、hibernate が作成するフィールド タイプは varbinary(255) になります。これにより、文字列の切り捨てエラーが発生します。これを回避するために、@lob アノテーションを使用しました。これは当時は疑問に感じましたが、うまくいきました。この時点で、私は HSQLDB を使用していました。

ここで、アプリケーションを MSSQL に対して実行する必要があります。Hibernate を使用してスキーマを生成しました。referenceItems は、ReferenceForm テーブルのイメージ列です。項目自体は ReferenceItem テーブルに格納されます。

ここで @lob は適切なアノテーションですか?

編集: ReferenceItem は次のようになります。

@Entity
public class ReferenceItem implements Serializable {

private static final long serialVersionUID = -9077063073733429102L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
long id;

private Title title;
private String firstName;
private String surname;
private String positionHeld;
private String institutionCompany;

@Embedded
private Address address;
@Embedded
private Telephone telephone;

private String email;
private boolean existingReference;

private String fileName;

public ReferenceItem() {
}

...getters and setters
}

2番目の編集:

@OneToMany の使用を提案してくれた Willome に感謝します。結局、これがうまくいきました。

//from

@lob
private AutoPopulatingList<ReferenceItem> referenceItems;
//to
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<ReferenceItem> referenceItems = new AutoPopulatingList<ReferenceItem>(ReferenceItem.class);
  • @OneToMany は関係の性質を正確に説明します
  • フィールドを定義するときは、実装の代わりにインターフェイス (List) を使用します。http://docs.jboss.org/hibernate/core/3.3/reference/en/html/collections.htmlを参照してください。
  • CascadeType を定義しないと、エンティティの保存時に次のエラーが表示されます: org.hibernate.TransientObjectException: オブジェクトが保存されていない一時的なインスタンスを参照しています
  • FetchType EAGER を作成しないと、別のトランザクションでフォームをロードできません: 次のエラーが表示されます:ロールのコレクションを遅延して初期化できませんでした: ReferenceForm.referenceItems、プロキシを初期化できませんでした - セッションがありません
4

2 に答える 2

1

@Lob注釈を a@OneToManyに置き換え、AutoPopulatingListをインターフェイス タイプとして宣言されたコレクション値フィールドに置き換える必要があります (トピック 6.1 を参照してください。このリンクの永続的なコレクションhttp://docs.jboss.org/hibernate/core/3.3/参照/en/html/collections.html .)

//@Lob
@OneToMany(mappedBy = "referenceForm")
private AutoPopulatingList<ReferenceItem> referenceItems; //fail AutoPopulatingList is not an interface 

@OneToMany(mappedBy = "referenceForm")
private Set<ReferenceItem> referenceItems; // OK with Set/Collection/List
于 2013-07-03T12:29:27.227 に答える
0

@OneToMany の使用を提案してくれた Willome に感謝します。結局、これがうまくいきました。

//から

@lob
private AutoPopulatingList<ReferenceItem> referenceItems;

//に

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<ReferenceItem> referenceItems = new AutoPopulatingList<ReferenceItem>(ReferenceItem.class);
  • @OneToMany は関係の性質を正確に説明します

  • フィールドを定義するときは、実装の代わりにインターフェイス (List) を使用します。http://docs.jboss.org/hibernate/core/3.3/reference/en/html/collections.htmlを参照してください 。

  • CascadeType を定義しないと、エンティティの保存時に次のエラーが表示されます: org.hibernate.TransientObjectException: オブジェクトが保存されていない一時的なインスタンスを参照しています

  • FetchType EAGER を作成しないと、別のトランザクションでフォームをロードできません: 次のエラーが表示されます: ロールのコレクションを遅延して初期化できませんでした: ReferenceForm.referenceItems、プロキシを初期化できませんでした - セッションがありません

于 2013-07-17T08:49:15.183 に答える