これらが私の親と私の子オブジェクトであると仮定します:
親:
@Entity
@Table( name = "import_table" )
public class ImportTable {
@Cascade( { CascadeType.ALL, CascadeType.DELETE_ORPHAN } )
@OneToMany(
mappedBy = "table",
fetch = FetchType.EAGER
)
public List<ImportTableColumn> getColumns()
{
return columns;
}
... setter is defined but I don't think it's important for the example
}
子:
@Entity
@Table( name = "import_table_column" )
public class ImportTableColumn {
@ManyToOne
@JoinColumn(
name = "import_table_name",
nullable = false
)
public ImportTable getTable()
{
return table;
}
}
次の疑似コードが機能します
- ImportTable のインスタンスを作成し、2 つの列を追加し、セッションを作成して保存し、セッションを閉じます。
- 保存されたインスタンスを別のセッションで読み取り、1 つの列を削除します。
- 別のセッションに保存します。
- 列数を確認し、1 に等しい。
ただし、次の場合は機能しません。
- ImportTable のインスタンスを作成し、2 つの列を追加し、セッションを作成して保存し、セッションを閉じます。
- 保存されたインスタンスを別のセッションで読み取ります。
- 保存されたオブジェクトを手動で再作成します。
- 列を削除します。
- 別のセッションに保存します。
- 列数を確認し、1 に等しい。
この理由は、Java サーバー/Flex クライアント アプリケーションがあり、オブジェクトをロードしてクライアントに送信し、クライアントに必要なことをすべて実行させ、オブジェクトをサーバーに送り返す必要があるためです。それを保存。
オブジェクトを再作成すると、Hibernate が失われていると思います。私の知る限り、Hibernate はオブジェクトがデータベースから取得されるときにオブジェクトに何かを挿入します。オブジェクトを再作成するとき、オブジェクト クラスで宣言されたフィールド以外はコピーしません。これは、オブジェクトを再作成するコードです (私の単体テスト用):
private ImportTable recreate( ImportTable original ) throws IOException
{
final ImportTable copy = new ImportTable();
copy.setDatabaseTableName( original.getDatabaseTableName() );
copy.setDisplayTableName( original.getDisplayTableName() );
if( original.getColumns() != null ) {
copy.setColumns( new ArrayList<ImportTableColumn>( original.getColumns().size() ) );
for( ImportTableColumn originalColumn : original.getColumns() ) {
final ImportTableColumn copyColumn = new ImportTableColumn();
copyColumn.setTable( copy );
copyColumn.setDatabaseColumnName( originalColumn.getDatabaseColumnName() );
copyColumn.setDatatype( originalColumn.getDatatype() );
copyColumn.setExcelColumnName( originalColumn.getExcelColumnName() );
copyColumn.setId( originalColumn.getId() );
copyColumn.setLength( originalColumn.getLength() );
copyColumn.setPk( originalColumn.isPk() );
copyColumn.setRequired( originalColumn.isRequired() );
copyColumn.setPrecision( originalColumn.getPrecision() );
copy.getColumns().add( copyColumn );
}
}
return copy;
}
オブジェクトを再作成すると、休止状態が失われると思います。私が休止状態にしたいのは、データベースにあるものとオブジェクトにあるものを比較し、違いだけを保存することです。それを行う方法はありますか?