假设这些是我的父母和孩子的对象:上级:@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将集合实例包装到AbstractPersistentCollection的适当子类中。然后,该PersistentCollection正在跟踪已删除的集合元素;没有它,Hibernate将只能对其执行插入/更新(在大多数情况下;对于某些id生成器类,甚至是不可能的)。基本上,你在那里不走运。您唯一可以做的就是从数据库中加载现有实体(ImportTable)并对其进行修改(例如,删除已加载副本中存在但不存在于您的克隆中的集合元素),然后保存它。就是说,我不太理解为什么您首先需要克隆实体(我不知道Flex ...您是否要将实体编组为XML / JSON /等?)所有PersistentCollection实现都是,因此可以通过电线发送并返回。有多种方法可以将它们编组为XML并返回。
07-24 13:40