Java Hibernate在保存对象时不会回滚生成的Id 这是我的示例实体 @实体 @表(name=“company”}) 公共类公司实现可序列化{ @身份证 @GeneratedValue(策略=GenerationType.IDENTITY) @列(name=“id”,unique=true,nullable=false) 私人长id; @NotNull @列(name=“name”,nullable=false,unique=true) 私有字符串名称; @ManyToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL) @JoinTable(name=“公司\联系人”, joinColumns={@JoinColumn(name=“companyId”)}, inverseJoinColumns={@JoinColumn(name=“contactId”)} 私人名单联系人; } @实体 @表(name=“contact”) 公共类联系人实现可序列化{ /** * */ 私有静态最终长serialVersionUID=637603479937829299L; @身份证 @GeneratedValue(策略=GenerationType.IDENTITY) @列(name=Contact.Column\u ID,unique=true,nullable=false) 私人长id; @列(name=Contact.Column\u name,unique=true) 私有字符串名称; }
现在,当我试图保存此对象时,两个对象的name属性值相同。Hibernate会引发唯一约束异常,并且在保存同一对象时,Hibernate会引发批处理更新失败异常,因为Hibernate为该对象设置的id未删除。如果保存两个同名对象,则会引发此异常 更改此项:Java Hibernate在保存对象时不会回滚生成的Id 这是我的示例实体 @实体 @表(name=“company”}) 公共类公司实现可序列化{ @身份证 @GeneratedValue(策略=GenerationType.IDENTITY) @列(name=“id”,unique=true,nullable=false) 私人长id; @NotNull @列(name=“name”,nullable=false,unique=true) 私有字符串名称; @ManyToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL) @JoinTable(name=“公司\联系人”, joinColumns={@JoinColumn(name=“companyId”)}, inverseJoinColumns={@JoinColumn(name=“contactId”)} 私人名单联系人; } @实体 @表(name=“contact”) 公共类联系人实现可序列化{ /** * */ 私有静态最终长serialVersionUID=637603479937829299L; @身份证 @GeneratedValue(策略=GenerationType.IDENTITY) @列(name=Contact.Column\u ID,unique=true,nullable=false) 私人长id; @列(name=Contact.Column\u name,unique=true) 私有字符串名称; },java,hibernate,jdbc,Java,Hibernate,Jdbc,现在,当我试图保存此对象时,两个对象的name属性值相同。Hibernate会引发唯一约束异常,并且在保存同一对象时,Hibernate会引发批处理更新失败异常,因为Hibernate为该对象设置的id未删除。如果保存两个同名对象,则会引发此异常 更改此项: Here is my sample Entity @Entity @Table (name = "company"}) public class Company implements Serializable { @Id
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;
}
为此:
@Column (name = "name", nullable = false, unique = true)
private String name;
我假设您正试图用联系人列表保存一个公司,两个对象都有相同的名称您指的是name=“Jose”的公司和name=“Jose”的联系人 这不是问题,因为我们讨论的是两个不同的表(公司联系人),检查您的数据库是否已经有此实体
因此,请检查两次,如果仍然存在问题,请将整个异常stacktrace和您试图执行的操作(但只是一段代码片段)。能否提供一个代码示例,说明如何保存对象以及如何处理回滚?我认为这不是因为Hibernate,而是因为SQL ID Unique字段。在您的情况下,ID充当一个唯一的PK字段,请尝试在ID PK上设置自动递增。您可以向我们显示
联系人。COLUMN\u ID
和联系人。COLUMN\u NAME
的值吗?除了前面的人所说的,您还可以发布完整的错误消息和stacktrace吗?这两个名称不在同一个表中
@Column (name = "name", nullable = false)
private String name;