JPA каскад удалить - PullRequest
       3

JPA каскад удалить

2 голосов
/ 23 марта 2012

Возникла проблема при удалении записи, на которую ссылается другая таблица.

Это пример кода (самый простой сценарий):

@Entity
@Table(name = "user")
public class User
{
    @Id
    @GeneratedValue(generator="user_id_seq", strategy = GenerationType.SEQUENCE)
    @SequenceGenerator(name="user_id_seq", sequenceName="user_id_seq")
    @Column(name = "id", nullable = false)
    private int id;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
    private Set<UserLog> userLogSet;

    // Other attributes
    // Getters/setters
}

@Entity
@Table(name = "user_log")
public class UserLog
{
    @Id
    @GeneratedValue(generator="user_log_id_seq", strategy = GenerationType.SEQUENCE)
    @SequenceGenerator(name="user_log_id_seq", sequenceName="user_log_id_seq")
    @Column(name = "id", nullable = false)
    private int id;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "user_id", nullable = false)
    private User user;

    // Other attributes
    // Getters/setters
}

Всякий раз, когда я пытаюсь удалить запись из таблицы «user», я получаю следующую ошибкуиз postgreSQL:

ОШИБКА: обновление или удаление в таблице «пользователь» нарушает ограничение внешнего ключа «fk228a019fd2495d20» в таблице «user_log»Подробно: на ключ (id) = (5) все еще ссылаются из таблицы "user_log".

Что я делаю не так?

Спасибо!

Обновление: Я попытался написать небольшой пример, его можно найти здесь .После запуска приложения с Tomcat схема базы данных создается автоматически (см. Подробности подключения в /src/main/webapp/WEB-INF/jdbc.properties).При посещении http://localhost:8080 некоторые данные вставляются в базу данных.Если я пытаюсь удалить любого teacher, на которого есть ссылка в таблице student (используя phpPgAdmin), я получаю ошибку, аналогичную приведенной выше.

Ответы [ 2 ]

1 голос
/ 23 марта 2012

Кажется, что ваше отображение неверно.

У пользователя может быть много UserLogs.

Также в коллекции должно быть @OneToMany, например, java.util.Set.Каскад, который вы поместили, находится в UserLog, который будет иметь место, если вы будете действовать от имени UserLog, а не от User.

Насколько я понимаю, отображение изменений выглядит следующим образом.Вы хотите удалить User и все его UserLog, просто удаляя User и оставляя UserLogs не имеет смысла.

Надеюсь, это поможет.

Обновление:

Каскады, аннотированные в классах сущностей, управляются ORM, за исключением случаев, когда вы внешне пытаетесь удалить их из внешних инструментов, таких как phpPgAdmin.

0 голосов
/ 23 марта 2012

Ваше отображение неверно, OneToMany должно быть в User применительно к коллекции UserLog.См. примеры .

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