保存对象时,Hibernate不会回滚生成的Id

时间:2016-05-20 13:16:12

标签: java hibernate jdbc

Here is my sample Entity

@Entity
@Table (name = "company"})
public class Company implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", unique = true, nullable = false)
    private long id;

    @NotNull
    @Column (name = "name", nullable = false, unique = true)
    private String name;

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "company_contact", 
                joinColumns = { @JoinColumn(name = "companyId") }, 
                inverseJoinColumns = { @JoinColumn(name = "contactId") })
    private List<Contact> contacts;
}

@Entity
@Table (name = "contact")
public class Contact implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 637603479937829299L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = Contact.COLUMN_ID, unique = true, nullable = false)
    private long id;

    @Column(name = Contact.COLUMN_NAME, unique = true)
    private String name;

}

现在,当我尝试保存此对象时,该对象的名称属性具有相同的值。 Hibernate抛出唯一约束异常,一旦保存同一个对象,hibernate抛出批量更新失败异常,因为hibernate设置的id不会被删除。

2 个答案:

答案 0 :(得分:0)

我想您正在尝试保存包含联系人列表的公司,这两个对象的名称都相同,即您的公司名称为“ Jose”,联系人的名称为“ Jose”?

这不是问题,因为我们谈论的是两个不同的表(公司<>联系人),请检查您的数据库是否已有此实体。

因此请检查两次,如果仍然有问题,请放入整个异常堆栈跟踪以及您要执行的操作(但代码段)。

答案 1 :(得分:-2)

如果保存两个具有相同名称的对象,则抛出此异常

改变这个:

@Column (name = "name", nullable = false, unique = true)
private String name;

到此:

@Column (name = "name", nullable = false)
private String name;