Проблема с CascadeType.ALL и обратными вызовами жизненного цикла - PullRequest
0 голосов
/ 15 июня 2011

У меня есть некоторые проблемы с хранением этого простого отображения:

@Entity
public class Account extends UUIDBase {
    private Profile profile;

    @OneToOne(cascade = CascadeType.ALL, optional = false)
    public Profile getProfile() {
       return profile;
    }

    public void setProfile(Profile profile) {
        this.profile = profile;
    }
}

@Entity
public class Profile extends UUIDBase {
  ...
}

Наши сущности имеют все атрибуты "creationDate" и "lastUpdated". Эти атрибуты помещаются в сопоставленный суперкласс UUIDBase. Когда сущность сохраняется или обновляется, оба поля будут обновляться в обратных вызовах @PrePersist и @PreUpdate. Это отлично работает, за исключением случая каскадирования.

Когда мы храним учетную запись , профиль также будет сохраняться всегда. Атрибут creationDate и lastUpdated учетной записи будут инициализированы с помощью методов обратного вызова. Методы обратного вызова для профиля не будут вызываться. У вас есть подсказка, что происходит не так?

Ответы [ 2 ]

0 голосов
/ 16 июня 2011

Спасибо за ваш ответ. Я думаю, что я исправил это сейчас. Я описал две сущности "Аккаунт" и "Профиль" выше. Сущность «Сотрудник» отсутствует в моем описании выше. Вот карта:

@Entity
public class Employee extends UUIDBase {
    public Account account;

    @OneToOne(cascade = {CascadeType.REFRESH, CascadeType.REMOVE}, orphanRemoval = true)
    public Account getAccount() {
        return this.account;
    }

    public void setAccount(Account account) { 
        this.account = account;
    } 

}

Отображение «Сотрудник может иметь учетную запись. У учетной записи должен быть профиль». Проблема в классе обслуживания:

public void saveEmployee(Employee data) {
    Employee savedEmployee = empDao.saveEmployee(data);
    accountService.saveAccount(data.getAccount()); <-- Here is the failure
}

Сначала я сохраняю сотрудника и возвращаю сохраненный объект сотрудника. После этого я пытаюсь сохранить учетную запись сотрудника через собственный сервис. Когда я беру учетную запись сохраненного объекта сотрудника, все работает и вызываются обратные вызовы. Когда я беру учетную запись из параметра «данные», обратные вызовы не вызываются.

0 голосов
/ 15 июня 2011

Они должны быть названы.Убедитесь, что вы правильно регистрируете обратные вызовы.

Была проблема с обратными вызовами в MappedSuperclass, которая не была вызвана, которая была недавно исправлена, поэтому вам может потребоваться добавить обратные вызовы в подкласс в 2.2.1004 * Вы уверены, что обратные вызовы не вызываются или значения просто не обновляются?

Если вы напрямую вызываете persist для профиля, вызывается ли обратный вызов?

Как зарегистрироватьОбратный вызов

...