Как удалить строки после изменения элемента в отношении JPA OneToOne? - PullRequest
2 голосов
/ 01 апреля 2009

Как получить элемент OneToOne для автоматического удаления с помощью JPA / Hibernate? Я ожидаю, что простая установка элемента OneToOne в значение null в классе, который содержит, достаточно умна, чтобы позволить Hibernate удалить его.

Учитывая простой объект, упрощенный:

@Entity
public class Container {
    private Item item;

    @OneToOne(cascade=CascadeType.ALL)
    public Item getItem() { return item; }

    public void setItem(Item newItem) { item = newItem; }
}

Когда элемент установлен в контейнере, контейнер сохраняется со слиянием и вставляется строка.

Container container = new Container();
container.setItem(new Item());
container = entityManager.merge(container);
// Row count is 1

Но если для элемента задано значение NULL или для другого элемента, старый объект все еще существует в таблице.

container.setItem(null);
container = entityManager.merge(container);
// Row count is STILL 1, leaving orphaned rows.

Итак, как мне удалить этих сирот OneToOne?

Ответы [ 4 ]

1 голос
/ 17 декабря 2009

Я догадываюсь , что причина спящего режима, не разрешающая отношения DELETE_ORPHAN к OneToOne, связана с этой проблемой .

Если вы действительно хотите этого плохо, вы можете взломать свой путь с помощью следующих шагов:

  • преобразует ваше OneToOne отношение в OneToMany :
  • добавить метод, чтобы получить первый элемент дочерней коллекции (это необязательно, но удобно)
  • используйте аннотацию DELETE_ORPHAN

Конечно, это большой взлом.

0 голосов
/ 27 мая 2019

Поскольку JPA 2.0 выпущен очень давно, вы можете просто использовать:

@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
0 голосов
/ 02 апреля 2009

К сожалению, в JPA нет способа сделать это без привязки к реализации Hibernate.

Так что да, как говорит Фокси, вы можете использовать org.hibernate.annotations.CascadeType вместо стандартной аннотации JPA, которая позволяет вам указать DELETE_ORPHAN. Если вы хотите использовать абстракцию JPA, вы должны самостоятельно удалить сирот.

0 голосов
/ 02 апреля 2009

Попробуйте изменить на

@OneToOne
@Cascade(cascade = {CascadeType.ALL, CascadeType.DELETE_ORPHAN})

Смотрите также мой ответ на аналогичный пост здесь .

...