Hibernate:为列表中的同一对象引用生成不同的(唯一)ID

时间:2016-07-31 19:47:16

标签: java hibernate duplicates id-generation

问题

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

背景

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

Session.save(Object obj)处分配ID可能无法做到这一点,因为列表中仍然存在相同的对象。如果没有这方面的简单解决方案,我还要感谢一种方法来在保存或提交时删除重复的对象。请注意,将列表更改为集合并不能解决问题,因为相同的引用可以在不同的列表中。

实施例

数据库是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;

2 个答案:

答案 0 :(得分:0)

session.persist()会为您传入的每个对象创建一个新ID。如果您遇到问题,请与我们联系。

答案 1 :(得分:0)

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

的副本或克隆

执行以下操作:house3 = new House(house1);