Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> hibernate пометить поле удалённым, но не удалять физически 
V
    Опции темы
MisterCleric
Дата 4.5.2011, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Вообще советуют по какому-нибудь бизнес-ключу.
В твоем случае, наверное, uniqueConstraint достаточно. Но это, конечно, если оно у тебя всегда заполнено


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
Samotnik
Дата 4.5.2011, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 5
Всего: 191



MisterCleric, понял, спасибо. На счет сущностей, которые связывают другие, всё же способ не работает:
Код

@Table(uniqueConstraints=@UniqueConstraint(columnNames={"device_id", "app_id"}))
public class Subscriber {
    
    @Id
    @GenericGenerator(name="customIdGenerator",
                      strategy="CustomIdGenerator")
    @GeneratedValue(strategy=GenerationType.TABLE, generator="customIdGenerator")
    private long id;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "device_id")
    private Device device;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "app_id")
    private App app;

        private Boolean deleted = false;

Создаю запись:
id, device_id, app_id, deleted
(1; 5; 9; false)
Удаляю
(1; 5; 9; true)
Создаю опять точно такую же - 
(2; 5; 9; false)
Цитата

java.sql.BatchUpdateException: Duplicate entry '5-9' for key 'device_id'

 smile 

Это сообщение отредактировал(а) Samotnik - 4.5.2011, 16:53
PM MAIL   Вверх
MisterCleric
Дата 4.5.2011, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Не понял. Почему "Создаю такую же"?
Ведь это же новая запись: должен быть id новый.
Что у тебя за бардак такой?


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
Samotnik
Дата 4.5.2011, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 5
Всего: 191



MisterCleric, да, извини не дописал, уже исправил, id конечно же новый. Но при чем он тут ? У меня уникальность стоит по полям device_id + app_id именно по этому я не могу создать нового subscriber если уже существует такой же удалённый.

Это сообщение отредактировал(а) Samotnik - 4.5.2011, 16:59
PM MAIL   Вверх
Samotnik
Дата 4.5.2011, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 5
Всего: 191



Цитата(MisterCleric @  4.5.2011,  16:24 Найти цитируемый пост)
Что у тебя за бардак такой?

почему бардак smile
Вот представь, очень простой пример. Тебе дали задание разработать сущность "Пользователь" с двумя полями Имя, Фамилия. При условии, что нельзя создать двух одинаковых записей с одной именем + фамилией(например нельзя создать Дмитрий Петров дважды smile  )
Плюс предусмотреть сохранение удалённых пользователей, т.е. не удалять их физически из БД, а каким-либо образом помечать что они удалены и не мешали созданию новых полей (и их удаление) Т.е. БД должна себя вести, как будто этих записей нету в таблице. 
Это я релизовал с помощью флага deleted, путем выставления его в null при удалении записи. С MySQL всё превосходно работало, а вот с Oracle нет.    

PM MAIL   Вверх
MisterCleric
Дата 4.5.2011, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Тогда добавь к этой уникальности еще и ID.
Или вообще убери эту уникальность на внешние ключи.
Не понимаю ее смысла.
У тебя что по логике нельзя создать несколько Subscriber на один и тот же Device в одном и том же App?
Да и вообще самый идеальный вариант - провести нормализацию: удаленные записи переносить в архивные таблицы.


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
Samotnik
Дата 4.5.2011, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 5
Всего: 191



Цитата(MisterCleric @  4.5.2011,  17:19 Найти цитируемый пост)
Тогда добавь к этой уникальности еще и ID.

не вариант, тогда можно будет создавать Дмитрий Петров сколько угодно раз.
Цитата(MisterCleric @  4.5.2011,  17:19 Найти цитируемый пост)
Не понимаю ее смысла.

смысл в том, чтобы запретить создавать более одной записи Дмитрий Петров
Цитата(MisterCleric @  4.5.2011,  17:19 Найти цитируемый пост)
Да и вообще самый идеальный вариант - провести нормализацию: удаленные записи переносить в архивные таблицы.

а это как ? smile Можно ссылку или пример ?
Цитата(MisterCleric @  4.5.2011,  17:19 Найти цитируемый пост)
У тебя что по логике нельзя создать несколько Subscriber на один и тот же Device в одном и том же App?

нет, нельзя, а какой смысл создавать их несколько ?
Зачем столько записей ? Подписчик должен быть один.
id, device_id, app_id, deleted
(1; 5; 9)
(2; 5; 9)
(3; 5; 9)
(4; 5; 9)
(5; 5; 9)
(6; 5; 9)
....


Это сообщение отредактировал(а) Samotnik - 4.5.2011, 17:57
PM MAIL   Вверх
MisterCleric
Дата 4.5.2011, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Не знаю таких ссылок, но на пальцах это так:
1. Копия оригинальной таблицы с префиксом ARC
2. Убираем констрейнты, окромя PK
3. Вызываем обычное удаление
4. В БД на удаление должен быть триггер на каждую таблицу
5. Он должен просто взять удаляемую запись и проинсертить в соответствующую архивную таблицу.
6. Потом ты сможешь эти записи доставать через named-query, а результат повесить на твою основную сущность.

Польза: разделяем данные по логике, повышается производительность на основной таблице.
Минусы: много работы на БД, написание named-query на удаленные записи.

Нужно здесь хорошенько подумать, стоит ли все данные оставлять: может будет нормальным, если какие-то связи все-таки будут удаляться навсегда?


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
Samotnik
Дата 5.5.2011, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 5
Всего: 191



Цитата(MisterCleric @  4.5.2011,  18:05 Найти цитируемый пост)

4. В БД на удаление должен быть триггер на каждую таблицу

триггер - это ведь sql код. т.е. вручную нужно прописывать, а через хибер можно как-нибудь написать триггер ? 
PM MAIL   Вверх
Samotnik
Дата 6.5.2011, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 5
Всего: 191



Если кому интересно, то проблема решилась как всегда - очень просто. 
Поле deleted - сделать типом long по дефолту = -1L, при удалении сетить в это поле тот id, который удаляется  smile

Добавлено через 6 минут и 7 секунд
Цитата(MisterCleric @  4.5.2011,  14:54 Найти цитируемый пост)
Вообще советуют по какому-нибудь бизнес-ключу.
В твоем случае, наверное, uniqueConstraint достаточно. Но это, конечно, если оно у тебя всегда заполнено

так может тогда лучше по id ? 
PM MAIL   Вверх
MisterCleric
Дата 6.5.2011, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Привет. Решение красивое.
Сам додумался? 
Век живи - век учись...

По поводу equals & hashCode. 
У меня вот такой вот класс для всех сущностей:
Код

public abstract class BaseEntity<ID extends Serializable> implements Serializable {
    public abstract ID getId();

    public abstract void setId(ID id);

    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        BaseEntity other = (BaseEntity) o;

        if (getId() != null ? !getId().equals(other.getId()) : other.getId() != null) return false;

        return true;
    }

    public int hashCode() {
        return getId() != null ? getId().hashCode() : super.hashCode();
    }
}


Я, кажись, его тут уже на форуме выкладывал.
Он хорошо работает в рамках логики, которую пишу я. Но для самого Hibernate оно не годиться, так как тот у себя в коде использует класс org.hibernate.util.IdentityMap, который для hashCode вызывает System.identityHashCode, а для equals еще хуже - идет сравнение ссылок.



--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
Samotnik
Дата 6.5.2011, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 5
Всего: 191



спс
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0887 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.