【问题标题】:Hibernate: generate different (unique) IDs for same object reference in a listHibernate:为列表中的相同对象引用生成不同(唯一)ID
【发布时间】:2016-12-05 21:11:04
【问题描述】:

问题

当一个列表中有两次相同的对象引用时,是否可以在 Hibernate 中进行插入,我想同时插入它们并且 ID 必须是唯一的?

背景

我正在使用random-beans 生成一个随机对象Person,它有一个House 类型的列表。 问题是 random-beans 不会每次都创建一个新的 house 对象,它有时也会使用现有的引用。在这种情况下,相同的房屋对象引用可以在人员列表中出现两次。 但不管随机 bean 是什么,我都想处理必须在 Hibernate 中的同一事务中提交的新对象的多个引用。

这可能通过在Session.save(Object obj) 处分配 ID 是不可能的,因为列表中仍然引用了相同的对象。如果对此没有简单的解决方案,我也会感谢一种在保存或提交时删除重复对象的方法。请注意,将 List 更改为 Set 并不能解决问题,因为相同的引用可以在不同的列表中。

示例

数据库是 MySQL 数据库。

主要

Person steven = new Person();
House house1 = new House();
House house2 = new House();
steven.setHouses(new ArrayList<House>(Arrays.asList(house1, house2, house1));

Session session = getSessionFactory().openSession();
session.beginTransaction();
session.save(steven); // this is where I need to generate 3 different IDs
session.getTransaction().commit(); // this is where a duplicate entry exception is thrown
session.close();

人物

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id_person")
private int id;

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private List<House> houses;

房子

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id_house")
private int id;

【问题讨论】:

    标签: java hibernate duplicates id-generation


    【解决方案1】:

    这是不可能的,因为你只有两个实例。您需要创建house1的副本或克隆

    做类似的事情:house3 = new House(house1);

    【讨论】:

    • 感谢您的意见。不幸的是,填充对象的代码不在我手中,因为我为此使用了随机 bean。所以我的情况是,我得到一个对象树,其中某处是同一对象的多个实例,现在我必须坚持它。
    • @Marvin 很遗憾你不能。这就是休眠的工作原理。
    • 好的,我已经预料到了 ;) 对于那些对随机豆问题感兴趣的人,see my issue report。
    【解决方案2】:

    session.persist() 将为您传入的每个对象创建一个新 ID。如果您遇到问题,请告诉我。

    【讨论】:

    • 它显示与session.save() 相同的行为。我认为 Hibernate 在这里做了正确的事情,因为我尝试两次插入同一个对象。但我需要一个智能机制来完成从“house1、house2、house1”到“house1、house2、house3”的转换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    相关资源
    最近更新 更多