使用自动增量索引在Hibernate中插入父/子行会引发错误

时间:2017-09-02 00:32:54

标签: scala hibernate

我在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表没有插入声明。

如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您需要在OneToMany关系上设置级联类型,以告诉Hibernate如何管理Group类的Items集合。所以例如这样的事情应该有效:

@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="group_sk") 
var items: java.util.List[Item] = _