我在Scala中有以下Hibernate类,其中一个Group
有许多Items
。请注意,Group
类的@Id具有自动增量注释。
@Entity
@Table(name = "items")
class Item extends Serializable {
@Id
@ManyToOne
@JoinColumn(name="group_sk", nullable=false)
var group: Group = _
@Id
var index: Int = _
var name: String = _
def canEqual(a: Any) = a.isInstanceOf[Item]
override def equals(that: Any): Boolean =
that match {
case that: Item => that.canEqual(this) && this.hashCode == that.hashCode
case _ => false
}
override def hashCode: Int = {
val prime = 31
var result = 1
result = prime * result + group.sk;
result = prime * result + index
return result
}
}
@Entity
@Table(name = "groups")
class Group {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "group_generator")
@SequenceGenerator(name="group_generator",
sequenceName = "GroupSeq", allocationSize = 1)
var sk: Int = _
@Column(name = "group_name")
var name: String = _
@OneToMany
@JoinColumn(name="group_sk")
var items: java.util.List[Item] = _
}
我尝试插入一个包含相关项目的组,其中Group
应该有一个自动递增的ID:
session.beginTransaction
val group = new Group
group.name = "Group name"
group.items = new java.util.ArrayList[Item]()
val item1 = new Item
item1.group = group
item1.index = 1
item1.name = "Item 1"
group.items.add(item1)
session.save(group)
session.getTransaction.commit
我得到的例外是
引起:javax.persistence.OptimisticLockException:批量更新 从update [0]返回意外的行数;实际行数:0; 预期:1
Hibernate sql日志显示:
Hibernate: select GroupSeq.nextval from dummy
Hibernate: insert into groups (group_name, sk) values (?, ?)
Hibernate: update items set group_sk=? where index=? and group_sk=?
请注意,上一个更新语句没有意义,因为您不会更新列也处于条件中的group_sk
的值。而且,items
表没有插入声明。
如何解决这个问题?
答案 0 :(得分:1)
您需要在OneToMany关系上设置级联类型,以告诉Hibernate如何管理Group类的Items集合。所以例如这样的事情应该有效:
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="group_sk")
var items: java.util.List[Item] = _