Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Удаление orphan one-to-many энтити


Автор: CPlusPlusFAN 25.2.2015, 23:36
Здравствуйте
Вот есть у меня 2 сущности:
Код

@Entity
@Table(name = "user")
public class UserEntity {
    @Id
    @GeneratedValue(generator = "uuid_gen")
    @GenericGenerator(name = "uuid_gen", strategy = "ru.test.hiber.entities.UUIDGenerator")
    @Column(name = "user_id", length = 32, nullable = false, unique = true)
    private String userId;
    @Column(name = "user_name", length = 50, nullable = false)
    private String userName;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "group_id", nullable = false)
    private GroupEntity group;

...
}

@Entity
@Table(name = "group")
public class GroupEntity {
    @Id
    @GeneratedValue(generator = "uuid_gen")
    @GenericGenerator(name = "uuid_gen", strategy = "ru.test.hiber.entities.UUIDGenerator")
    @Column(name = "group_id", length = 32, nullable = false, unique = true)
    private String groupId;
    @Column(name = "group_name", length = 50, nullable = false)
    private String groupName;

    @Cascade({ CascadeType.SAVE_UPDATE })
    @OneToMany(fetch = FetchType.LAZY, orphanRemoval = true)
    @JoinColumn(name = "group_id")
    private Set<UserEntity> users = new HashSet<>();

...
}


Можно ли сущности аннотировать так, чтобы при удалении последнего UserEntity, ссылающегося на определенный GroupEntity, тот тоже удалялся? Ну т.е. запретить GroupEntity, на которые не ссылается ни один UserEntity.
Или только руками менеджить такие ситуации?
Благодарю

Автор: Pawl 27.2.2015, 12:50
Цитата

   Можно ли сущности аннотировать так, чтобы при удалении последнего UserEntity, ссылающегося на определенный GroupEntity, тот тоже удалялся?
   ...
   Или только руками менеджить такие ситуации?
   

Про такие аннотации не знаю, но руками это сделать тоже не сложно. Просто каждый раз при удалении из GroupEntity очередного UserEntity, проверять, не стал ли список пустым, и, если да, удалять из таблицы пустой GroupEntity.

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Udaleniye-orphan-one-to-many-entiti-id54ee32e7ae2015f7138b4567#findElement_E7045_54f03deaae2015154c014a2b_0

Автор: CPlusPlusFAN 27.2.2015, 14:07
Pawl, ну да, этот способ самый очевидный. В инете не нашел автоматического способа. Видимо, его нет.

Автор: Pawl 27.2.2015, 21:39
Цитата

   В инете не нашел автоматического способа. Видимо, его нет.
   

На самом деле такая аннотация будет неоднозначной: если автоматически удалять объект, когда на него нет ссылок, то при его создании (занесении новой записи в БД, когда у нее еще нет связанных записей), он должен быть сразу удалён.

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Udaleniye-orphan-one-to-many-entiti-id54ee32e7ae2015f7138b4567#findElement_E7045_54f0b9c4ae2015d250014ac0_0

Автор: CPlusPlusFAN 28.2.2015, 01:17
Pawl, не обязательно. Можно такое сделать по тригеру удаления. В любом случае, можно создать сразу 2 связанные сущности и обе закомитить. Никаких проблем с этим нет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)