我们有一个父表, OneToMany 映射与子表如下所示。
@Entity
@Table(name = "PARENT_DETAIL")
public class ParentVO {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "parentSeqGen")
@SequenceGenerator(name="parentSeqGen", sequenceName="PARENT_SEQ", allocationSize = 1)
@Column(name = "PARENT_ID")
private Long parentId;
.............
................
@OneToMany( cascade=CascadeType.ALL, orphanRemoval= true)
@JoinColumn(name="PARENT_ID", nullable = false)
@BatchSize(size = 10)
private Set<ChildVO> childLists;
......................
}
和儿童表格为
@Entity
@Table(name = "PARENT_CHILD_MAPPING")
public class ChildVO {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "childSeq")
@SequenceGenerator(name="childSeq", sequenceName="CHILD_SEQ", allocationSize = 1)
@Column(name = "ID")
private Long id;
.............
}
现在,当我们更新Parent对象时,我们还需要更新子表。为此,我们在OneToMany注释中保留了CascadeType.All。
我们有3个孩子要更新。 Child表正在更新,但我可以在控制台中看到有3个Inserts,后面跟着3个孩子的3个更新。
我在某处读到了通过提供 mappedBy 属性可以避免更新(在外键上)。我们有单向关系,所以对于mappedBy有什么替代方案吗?或者我将不得不双向建立关系。
但我想BatchSize应该可行。它一次应该是3个插入,因为batchsize是10,对吗?
还在hibernate属性xml中提到了BatchSize。
<prop key="hibernate.jdbc.batch_size">20</prop>
我们正在使用HibernateTemplate更新方法(旧应用程序),如下所示。
public void update(IBaseVO vo) {
HibernateTemplate ht = new HibernateTemplate(sessionFactory);
ht.update(vo);
}