При удалении элемента воссозданного компонента не работает каскадный спящий режим - PullRequest
0 голосов
/ 15 декабря 2009

Предположим, что это мои родительские и дочерние объекты:

Родитель:

@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 сделал это, чтобы сравнить, что находится в базе данных с тем, что находится в объекте, и сохранить только различия. Есть ли способ сделать это?

1 Ответ

2 голосов
/ 15 декабря 2009

Hibernate упаковывает экземпляры коллекции в соответствующие подклассы AbstractPersistentCollection, когда сущность-владелец впервые присоединяется к сеансу.

что PersistentCollection затем отслеживает удаленные элементы коллекции; без него Hibernate сможет выполнять только вставки / обновления на них (в большинстве случаев; для некоторых классов генератора идентификаторов это даже невозможно).

Тебе там в основном не повезло; единственное, что вы можете сделать, это загрузить существующую сущность (ImportTable) из базы данных и изменить ее (например, удалить элементы коллекции, которые присутствуют в загруженной копии, но отсутствуют в вашем клоне), а затем сохранить ее.

Тем не менее, я не совсем понимаю, зачем вам сначала клонировать вашу сущность (я не знаю, Flex ... вы упорядочиваете свою сущность в XML / JSON / и т. Д.) Все PersistentCollection реализации Serializable и, следовательно, могут быть отправлены по проводам и обратно. Есть способы упорядочить их в XML и обратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...