web-dev-qa-db-ja.com

Hibernate Annotations:エンティティのデフォルトコンストラクターはありません

JAXBによって生成されたオブジェクトを永続化しようとしています。サンプル構造は次のとおりです。

@Column(name = "reporting_identifier")
private String reportingIdentifier;
@Column(name = "apply_quiet_time")
private boolean applyQuietTime;
@Embedded
private RecipientDetailsList recipientDetailsList;

以下はRecipientDetailsListクラスの構造です:

@ElementCollection(targetClass=String.class)
private List<RecipientDetails> recipientDetails;

現在、RecipientDetailsクラスには1つの引数コンストラクターがあり、Stringを受け入れます。その文字列は、レコード全体の一部としてデータベースに保持します。私は見ています

org.hibernate.InstantiationException:エンティティのデフォルトコンストラクターはありません:RecipientDetailsList

オブジェクトを保存しようとすると例外が発生します。 2つの質問があります。

  1. この例外を回避する方法はありますか? JAXBマーシャリング/アンマーシャリング用に設計されているため、クラスを変更できません。構造を変更せずに何らかの方法でオブジェクトを保存できますか?また、オブジェクトの行を1つだけにするため、recipientDetailsによって参照されるリストの最初のレコードのみを保存することに興味があります。複数のレコードがある場合、残りのレコードを無視するようにします。出来ますか?

  2. これは、JAXBによって生成されるクラスにアノテーションを直接使用するのに適した設計ですか?情報を保存および取得するためだけに、別のクラス(および場合によってはマッパー/コンバーター)を作成する必要がありますか?

15
user3968762

最初の質問:HibernateがBeanを作成しようとすると、リフレクションを介して行われるため、これが発生しています。引数なしのコンストラクターを呼び出してオブジェクトを作成し、次にセッターメソッドを使用してプロパティを設定します。引数なしのコンストラクターを持たないBeanは使用できません。

2番目の質問:引数なしのコンストラクターを持たないクラスが他に生成された場合、実際に唯一のオプション(クラスを変更できない場合)は、そのラッパーまたはそのサブクラスを作成することです引数なしのコンストラクタがあります。クラスを直接変更できない場合、他の方法はありません。ただし、サブクラス化は、取得したクラスがメソッドに対して十分な可視性を備えている(つまり、取得できないプライベートメソッドがない)限り問題ありません。

30