Hibernate - 持久化两个对象时的NonUniqueObjectException

时间:2014-04-16 18:18:03

标签: java hibernate exception orm

我有一个问题是将多个对象保存到数据库。我得到了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

3 个答案:

答案 0 :(得分:1)

问题似乎出现在密钥生成策略的Person类中。你在用哪一个?该错误意味着当将第二个人附加到会话时,第一个人已经在那里具有相同的数据库ID。

尝试确保@Id字段中没有设置任何值,让Hibernate使用密钥生成策略为其生成值。这是一个起点:

@Id
@GeneratedValue(strategy= GenerationType.AUTO)
protected Long id;

还要确保在Person的构造函数中没有使用该键的默认值。

答案 1 :(得分:0)

IIRC,如果你的equals()方法没有区分这些对象,就会发生这种情况。

答案 2 :(得分:0)

你能尝试saveOrUpdate()而不是persist吗?