0

これらが私の親と私の子オブジェクトであると仮定します:

親:

@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;
}

オブジェクトを再作成すると、休止状態が失われると思います。私が休止状態にしたいのは、データベースにあるものとオブジェクトにあるものを比較し、違いだけを保存することです。それを行う方法はありますか?

4

1 に答える 1

2

HibernateAbstractPersistentCollectionは、所有者エンティティが最初にセッションにアタッチされたときに、コレクション インスタンスを適切なサブクラスにラップします。

次にPersistentCollection、削除されたコレクション要素を追跡します。それがなければ、Hibernate はそれらに対してのみ挿入/更新を実行できます (ほとんどの場合、一部の id ジェネレーター クラスではそれさえ不可能です)。

あなたは基本的に運が悪いです。できる唯一のことはImportTable、データベースから既存のエンティティ ( ) をロードし、それを変更して (たとえば、ロードされたコピーには存在するがクローンには存在しないコレクション要素を削除する)、それを保存することです。

とは言っても、そもそもなぜエンティティを複製する必要があるのか​​ よくわかりません(Flexはわかりません...エンティティをXML / JSON /などにマーシャリングしていますか?)すべてのPersistentCollection実装はSerializableそうであり、したがって可能ですワイヤーを介して送信され、戻ってきます。それらを XML にマーシャリングして戻す方法もあります。

于 2009-12-15T03:47:23.143 に答える