Java @OneToOne实体的重复条目?

Java @OneToOne实体的重复条目?,java,hibernate,Java,Hibernate,我有一个简单的亲子关系 问题:在我的数据库中,有时有多个子元素映射到同一父元素 @Entity public class PersonEntity { @Id private long id; //assume every person can only have one car @OneToOne(mappedBy = "person", cascade = CascadeType.ALL, orphanRemoval = true) private

我有一个简单的亲子关系

问题:在我的数据库中,有时有多个子元素映射到同一父元素

@Entity
public class PersonEntity {
    @Id
    private long id;

    //assume every person can only have one car
    @OneToOne(mappedBy = "person", cascade = CascadeType.ALL, orphanRemoval = true)
    private CarEntity car;

    private String name;
}

@Entity
public class CarEntity {
    @Id
    private long id;

    @OneToOne
    @JoinColumn(name = "fk_person_id", foreignkey = @ForeignKey("name = "fk_person"))
    private PersonEntity person;

    private String name;
}
问题:我怎么可能有多个
car
元素映射到同一个人实体?hibernate怎么可能持久化这些元素?他们从哪里来

因此,当我获取具有多个car映射的person实体时,我当然会得到一个异常:

原因:org.hibernate.hibernateeexception:找到了多个具有给定标识符的行:123,对于类:CarEntity…

旁注:我最后想删除重复的
CarEntity
,只保留最新的一个。但我怎样才能防止将来发生这种情况呢

更新:

@Transactional
public PersonEntity createUpdatePerson(PersonDTO dto) {
    PersonEntity entity = dao.findByPersonName(dto.getName); //CrudRepository by spring
    if (entity == null) {
        entity = new Person();
    }

    mergeDTO(dto, entity); //copy and fill new values
    if (person.getId() == null) dao.save(entity);
    return entity;
}

private void mergeDTO(PersonDTO dto, PersonEntity entity) {
       if (dto.getCar() != null) {
             if (entity.getCar() == null) entity.setCar(new Car());
             entity.getCar().setName(dto.getCar().getName());
             entity.getCar().setPerson(entity);
       }
}

您的数据库数据仅通过带有hibernate的java应用程序填充??id可能是在您更新一个人并持久化实体时,它为您创建了一辆新车是的,我只使用java hibernate,带有
spring
层。不,我正在用
@Transactional
方法包装save/update调用,因此我不会重新生成实体。首先,发布相关代码:这就是创建/保存的地方。其次,在数据库中添加一个唯一的索引,那么至少您会得到一个关于duplicate的异常,这可能有助于识别这个问题。第三,打开SQL日志记录。合并方法呢?您询问的是重复的汽车,但在此区域没有显示代码。显示所有相关代码