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

标签 java hibernate duplicates id-generation

问题

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

背景

我正在使用random-beans生成一个随机对象 Person,它具有 House 类型的列表。 问题是 random-beans 不会每次都创建一个新的 house 对象,它有时也会使用现有的引用。在这种情况下,同一房屋对象引用可能会在人员列表中出现两次。 但无论随机 bean 如何,我都希望处理必须在 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;

最佳答案

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

的副本或克隆

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

关于java - Hibernate:为列表中的同一对象引用生成不同(唯一)ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38687815/

相关文章:

java - 迁移到 JDK 11 后,Spring Boot 由于 Hibernate 错误而失败

spring - 不支持 DML 操作。无法使用 spring 数据更新 postgresql 数据库中的数据

mysql - 防止重复条目自动递增

java - JLabel.setBackground(Color 颜色) 不起作用?

java - 变量的初始化

java - mappedBy 引用未知的目标实体属性 - hibernate 错误

C# : Fastest way to remove duplicates point3D linked to indices

list - 如何获取我在 groovy 中迭代的列表的引用

java - 在 JAX-RS Service jersey 实现中删除多个资源

java - jdbc-java-方法查询