JPA родительский ребенок удалить - PullRequest
2 голосов
/ 13 января 2010

У меня есть две сущности:

@Entity
public class Game implements Serializable{

@ManyToOne
@JoinColumn(name = "target_id")
protected GameObject target;
}

@Entity
public class GameObject implements Serializable {

@OneToMany(mappedBy = "target", cascade = CascadeType.ALL)
protected Collection<Game> games = new HashSet<Game>();    
}

В одной транзакции я удаляю игры из игрового объекта.

@Transactional
public void deleteEntity(Object entity) {
    getEntityManager().remove(entity);
    getEntityManager().flush();
}

После этого, когда я пытаюсь загрузить gameObject, он удаляет игру из коллекции. В этой игре только свойство id корректно, остальное равно нулю. Что не так, почему эта игра все еще в сборе?

1 Ответ

2 голосов
/ 13 января 2010

Поскольку у вас есть двунаправленные отношения между Game и GameObject . Когда вы удаляете Game , вы разрываете только одну сторону отношений; Вы удаляете ссылку Game -> GameObject в базе данных, но ссылка GameObject -> Game остается. Ваш метод deleteEntity должен сделать что-то вроде этого:

public void deleteEntity(Game game) {
    // WARNING - Untested code, only use as an example
    GameObject gameObject = game.getGameObject();
    gameObject.removeFromCollection(game);
    getEntityManager().remove(game);
    getEntityManager().merge(gameObject);
}

Ваша базовая база данных, вероятно, поддерживает ограничения внешнего ключа. Это означает, что когда ваша реализация JPA пытается удалить запись Game из базы данных, ограничение внешнего ключа, которое таблица GameObject имеет для таблицы Game , не позволит удалить запись, но это позволит разрешить обнуление всех значений вашего столбца (кроме, конечно, первичного ключа / идентификатора).

...