Предположим, что это мои родительские и дочерние объекты:
Родитель:
@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 столбца, создать сеанс, сохранить его, закрыть сеанс;
- Чтение сохраненного экземпляра в другом сеансе, удаление одного столбца;
- Сохранить в другом сеансе;
- Проверьте количество столбцов и равно единице.
Но следующее не сработает:
- Создать экземпляр ImportTable, добавить 2 столбца, создать сеанс, сохранить его, закрыть сеанс;
- Чтение сохраненного экземпляра в другом сеансе;
- Воссоздание сохраненного объекта вручную;
- Удалить столбец;
- Сохранить в другом сеансе;
- Проверьте количество столбцов и равно единице.
Причина этого в том, что у нас есть 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;
}
Я считаю, что спящий режим теряется, когда я воссоздаю объект. Я хочу, чтобы hibernate сделал это, чтобы сравнить, что находится в базе данных с тем, что находится в объекте, и сохранить только различия. Есть ли способ сделать это?