Hibernate:为列表中的相同对象引用生成不同的(唯一的)ID
Hibernate: generate different (unique) IDs for same object reference in a list
问题
当列表中有两次相同的对象引用时,是否可以在 Hibernate 中进行插入,我想同时插入它们并且 ID 必须是唯一的?
背景
我正在使用 random-beans 生成一个随机对象 Person
,它有一个 House
类型的列表。
问题是 random-beans 不会每次都创建一个新的 house 对象,它有时也会使用现有的引用。在这种情况下,同一个房屋对象引用可以在人员列表中出现两次。
但是不管随机豆如何,我都想处理必须在 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;
session.persist()
将为您传入的每个对象创建一个新 ID。如果您遇到问题,请告诉我。
这是不可能的,因为你只有两个实例。您需要创建 house1
的副本或克隆
做类似的事情:house3 = new House(house1);
问题
当列表中有两次相同的对象引用时,是否可以在 Hibernate 中进行插入,我想同时插入它们并且 ID 必须是唯一的?
背景
我正在使用 random-beans 生成一个随机对象 Person
,它有一个 House
类型的列表。
问题是 random-beans 不会每次都创建一个新的 house 对象,它有时也会使用现有的引用。在这种情况下,同一个房屋对象引用可以在人员列表中出现两次。
但是不管随机豆如何,我都想处理必须在 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;
session.persist()
将为您传入的每个对象创建一个新 ID。如果您遇到问题,请告诉我。
这是不可能的,因为你只有两个实例。您需要创建 house1
做类似的事情:house3 = new House(house1);