0

基本的に、エンティティ内の JPA 永続フィールドを、手動シリアル化で一時的であるように動作させたい

私はこのような基本的なクラスを持っています:

@Entity
public class Foo implements Serializable{
  @Id
  @GeneratedValue(strategy=GenerationType.TABLE)
  long id;

  String field;

  get/set field;

}

シリアル化では、ID もシリアル化されます。このクラスをデシリアライズして永続化すると、同じ ID が保持され、(JPA とのマージ後) データベース内の同じインスタンスになります。これはおそらく意図した動作ですが、逆シリアル化されたオブジェクトを、逆シリアル化のデータベース内の新しいオブジェクトにしたいと考えています。

IDを一時的にしようとしましたが、これはJPAを台無しにします。私が試した 2 番目のことは、逆シリアル化後に ID を null に設定することでした。その後、永続化が機能します。しかし、これは多くの異なるエンティティでかなり退屈になり、元の質問に戻ります。

それよりも簡単な方法はありますか?JPAもこれらのメソッドを使用するため、メソッドをオーバーライドしreadObject(...)てidをnullに設定しても機能しません。

4

2 に答える 2

1

新しいオブジェクトが必要な場合は、ID を無効にすることをお勧めします。一時的なものにするのは悪い考えのように思えます。ある時点で実際のオブジェクトをシリアル化する必要がある場合はどうでしょう。

EclipseLink を使用している場合は、オブジェクトを複製して ID を null にできる copy() API も提供されます。

http://wiki.eclipse.org/EclipseLink/Examples/JPA/AttributeGroup#Copy_Examples

于 2013-07-03T13:09:19.147 に答える
1

注釈を getter メソッドに移動してプロパティ アクセスを使用し、@Transient を使用する代わりにフィールドを一時的としてマークします。JPA はフィールドを無視し、get/set メソッドを使用してプロパティをマップしますが、シリアライゼーションはフィールドが一時的であることを認識して無視します。

@Entity
public class Foo implements Serializable{
  transient long id;
  String field;
  @Id
  @GeneratedValue(strategy=GenerationType.TABLE)
  public long getId(){ return id; }
  ..

  @Basic
  public String getField() {return field;}
  ..
于 2013-07-02T18:48:34.457 に答える