我有一个问题是将多个对象保存到数据库。我得到了org.hibernate.NonUniqueObjectException:具有相同标识符值的另一个对象已经与会话关联 我的代码: 配置cfg = new Configuration(); cfg.configure( “hibernate.cfg.xml中”);
ServiceRegistry registry = new StandardServiceRegistryBuilder().applySettings(
cfg.getProperties()).build();
SessionFactory factory = cfg.buildSessionFactory(registry);
Session session = factory.openSession();
Transaction t = session.beginTransaction();
Person p1 = new Person();
p1.setFirstName("Name1");
p1.setLastName("Surname1");
session.persist(p1);
Person p2 = new Person();
p2.setFirstName("Name2");
p2.setLastName("Surname2");
session.persist(p2);
t.commit();
session.close();
当我只保留一个物体时,一切正常。请帮忙。
编辑:
问题出在映射文件(* .hbm.xml)中: 这段代码意味着我必须在java代码中定义ID
<id name="id" type="int">
<column name="ID" />
<generator class="assigned" />
</id>
此代码自动设置ID:
<id name="id" type="int">
<column name="ID" />
<generator class="increment" />
</id>
现在每个新对象都自动拥有唯一ID
答案 0 :(得分:1)
问题似乎出现在密钥生成策略的Person
类中。你在用哪一个?该错误意味着当将第二个人附加到会话时,第一个人已经在那里具有相同的数据库ID。
尝试确保@Id
字段中没有设置任何值,让Hibernate使用密钥生成策略为其生成值。这是一个起点:
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
protected Long id;
还要确保在Person
的构造函数中没有使用该键的默认值。
答案 1 :(得分:0)
IIRC,如果你的equals()方法没有区分这些对象,就会发生这种情况。
答案 2 :(得分:0)
你能尝试saveOrUpdate()而不是persist吗?