Hibernate - NonUniqueObjectException - PullRequest
       0

Hibernate - NonUniqueObjectException

0 голосов
/ 03 июня 2011

Я использую JPA / Hibernate с управлением транзакциями Spring в моем приложении. Существует InspectionEntity, который имеет отношение один ко многим с InspectionDetailEntity. PK для обоих объектов создаются триггером вставки в базе данных. Значения PK при попытке сохранить - это значение по умолчанию 0. Я добавляю InspectionDetailEntity в InspectionEntity, вызывая addInspectionDetail (), а затем сохраняю InspectionEntity - entityManager.persist(inspection); Я ожидаю, что Inspection будет сохранен со всеми InspectionDetail. Но это приводит к org.hibernate.NonUniqueObjectException: другой объект с тем же значением идентификатора уже был связан с сеансом: [com.xyz.entity.InspectionDetailEntity # 0]. Я также попытался установить Set непосредственно в InspectionEntity (без использования addInspectionDetail ()). Это также приводит к той же ошибке. Любая помощь будет принята с благодарностью.

@Entity
@Table(name = "tb_inspection")
public class InspectionEntity {

    @Id
    @Column(name = "inspection_id")
    private Integer inspectionId;

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "inspectionDetailId", cascade = CascadeType.ALL)
    @JoinColumn(name = "inspection_id", insertable = true, updatable = true)
    private Set<InspectionDetailEntity> inspectionDetails;

    /**
     * Adds a inspectionDetailEntity to the set of inspectionDetails
     * @param inspectionDetailEntity
     */
    public void addInspectionDetail(InspectionDetailEntity inspectionDetailEntity) {
        if(inspectionDetails == null)
            inspectionDetails = new HashSet<InspectionDetailEntity>();
        inspectionDetailEntity.setInspection(this);
        inspectionDetails.add(inspectionDetailEntity);
    }
    //setter and getters
}


@Entity
@Table(name = "tb_inspection_dtl")
public class InspectionDetailEntity {

    @Id
    @Column(name = "inspection_dtl_id")
    private Integer inspectionDetailId;

    @Column(name = "inspection_id")
    private Integer inspectionId;

    @ManyToOne
    @JoinColumn(name="inspection_id", insertable = false, updatable = false)
    private InspectionEntity inspection;


    //setters and getters 

}

Ответы [ 2 ]

2 голосов
/ 03 июня 2011

Не устанавливайте id на 0, прежде чем сохранить его. Оставьте это как ноль. Если значение установлено, Hibernate будет считать, что объект уже находится в базе данных, и попытаться обновить его.

И вы, вероятно, получили несколько объектов с одинаковым идентификатором (0).


Обновление

Пока я думаю об этом, вы, вероятно, вынуждены установить id на какое-то значение, потому что у вас нет генератора id, и Hibernate ожидает, что вы предоставите значение для id. Однако в Hibernate нет ничего, что могло бы обновить идентификаторы на ваших объектах после вставки. Таким образом, вы получите несколько объектов в сеансе с идентификатором 0.

Я не уверен, что было бы хорошим решением для этой ситуации. Скорее всего вам нужно будет написать собственный генератор идентификаторов. Но в случае последовательностей, например, это требует дополнительного вызова базы данных. Может быть, вы должны рассмотреть вопрос о назначении идентификатора, кроме триггера?

0 голосов
/ 03 июня 2011

Попробуйте удалить

inspectionDetailEntity.setInspection(this);

или

inspectionDetails.add(inspectionDetailEntity);

Не думаю, что вам нужны оба.

Возможно, стоит рассмотреть вопрос об однонаправленных отношениях между вашим ребенком и родителем

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...