假设这些是我的父母和我的孩子对象:
父:
@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;
}
}
以下伪代码将起作用
但以下情况不起作用:
原因是我们有一个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会丢失。我希望hibernate做的是比较数据库中的内容与对象中的内容并仅保存差异。有没有办法做到这一点?
答案 0 :(得分:2)
当所有者实体首次附加到会话时,Hibernate将集合实例包装到AbstractPersistentCollection
的适当子类中。
然后PersistentCollection
跟踪已删除的集合元素;如果没有它,Hibernate将只能对它们执行插入/更新(在大多数情况下;对于某些id生成器类,即使这是不可能的)。
ImportTable
)并对其进行修改(例如删除加载副本中但不在克隆中的集合元素)然后保存它。
那就是说,我不太关注为什么你需要首先克隆你的实体(我不知道Flex ......你是否正在将你的实体编组为XML / JSON /等?)所有{{1实现是PersistentCollection
,因此可以通过线路返回。有一些方法可以将它们编组为XML并返回。