2010-01-13 3 views
2

У меня есть две сущности:JPA родитель ребенка удалить

@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 правильно, остальное равно null. Что не так, почему эта игра все еще в коопции?

ответ

2

Потому что у вас есть двунаправленная связь между играми и GameObject субъектами. Когда вы удаляете Игра, вы отделяете только одну сторону отношения; вы удаляете ссылку 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 пытается удалить запись игры из базы данных, ограничение внешнего ключа, которое имеет таблица GameObject в таблице игр , не будет, разрешить запись записи, но она будет разрешить обнуление всех значений столбца (за исключением первичного ключа/идентификатора, конечно).

Смежные вопросы