Re[3]: Spring+Hibernate + OneToMany<->ManyToOne bidirectional relationship
От: GreenTea  
Дата: 25.10.13 21:09
Оценка:
Здравствуйте, andreyzz, Вы писали:

GT>>Тут не понял, вы пытаетесь сохранить parentDataList, и в то же время в геттере сущности какая то логика, по вытаскиванию списка извне.

GT>>Дам вам совет, никакой логики в сущностях модели. Обычный гет и сет. Иначе намучаетесь с хибернетом, даже если на первый взгляд покажется что проблемм нет.
A>тут как раз все нормально ( не зря же я целый день гугл и форумы буржуинские читал) при условии, тчо геттер\сеттер акромя как hibernate никем не используется ( в моем случае я их package local сделал для этого) в моем нормальном коде я такие интересные моменты ссылками с объяснениями комментирую, если там шибко много и умно расписывают. тут банально — если есть логика, то сам не трогай! иначе будет dirty entity

Не понял объяснения.. Хибренет работает в обход этого геттера напрямую с полем? Если нет — то будут проблемы.

A>как на выходе своего parentService получить цельный экзепляр Parent с востановленным dataHolder внутри него ...

public void setAccountCookieList(Set<ParentData> parentDataList) {
    assert this.parentDataList != null;
    this.parentDataList.addAll(parentDataList);
    dataHolder.addAll(parentDataList)
  }

А кто будет вызывать этот сеттер?
Может все таки должно быть setParentDataList? Хотя судя по логике внутри — нет.. Вообще каша какая-то. Я этот код не понимаю
Можете описать требования словами без кода? Т.к. у меня подозрение что вы все реализовали.. кхм, не совсем правильно с архитектурной точки зрения.

GT>>Поставте аннотацию @Transactional на реализации сервиса с propagation=REQUIRED, а так же на реализации дао с propagation=MANDATORY. Так при вызове сервиса будет создана новая транзакция если ее не было, а на дао она же подхватится, или будет кинуто исключение если транзакции нет (чтобы нельзя было вызывать дао не из веб сервисов). На юнит тесте вообще не уверн нужна ли она.


A>у меня нет веб-сервисов. вообще. спринг это еще и java SE все-таки.

A> транзакции как раз создаются нормально, я же хочу получать not-managed-by-hibernate-entity на выходе сервиса. покурил еще документацию, похоже что это невозможно, если не делать deep copy объектов явно.
A>для моих целей это не критично, потому оставляю как есть.

А я и не говорил про веб сервиса.

@Service
public class PArentServiceImpl {

Это обычный сервис. Транзакция есть только на момент вызова к примеру sf.getCurrentSession().get(Parent.class,id); о после возвращения результата ее уже не будет. А должна обрамлять весь вызов к сервису, т.к. если внутри сервиса, посреди бизнес операции вылетит эксепшен, а вы до этого поменяли данные, то первоначальные изменения будут сохранены — что не есть правильно. + если после возврата сущности надо будет подгрузить ленивых чайлдов, то без активной транзакции это не удастся.

A>на юнит-тестах транзакции нужны, просто у каждого теста будет сделан rollback по его окончании ( это дефолтное поведение тестов для работы с орм) т..е все будет ок.


A>все-равно спасибо за ответы )


Кстати, дурной тон писать трансляцию в статическом методе.
public static ParentData createData(Parent parent,IData data) {
        setParent(parent).
        ...
        //копируем данные из data в свои поля
     }

Используйте для этого транслятор (некоторые называют ассемблер), — объект который конвертирует IData в ParentData и если надо — наоборот.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.