Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Свойства сущности не меняются после вызова dao.findByID(id)

Автор вопроса: Feras WilsonОтветов: 2

Вопрос здесь в том, почему свойства объекта не сохраняются после вызова некоторых сеттеров объекта. Обычно при изменении свойства управляемого объекта оно должно распространяться на базу данных.

Взгляните на этот пример:

@Service
public class SystemServiceImpl implements SystemService {

@Autowired
private SystemDao systemDao;


@Override
@Transactional
public System replace(Long systemID) {

    // External system to replace
    System system = systemDao.findByID(systemID);
    if (null != system) {
        system.setName("Test"); // Calling findByID again shows that this call did not have any effect.
    }
    return system;
}

}

-

@Entity
@Table(name = "db.system")
public class System {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long systemID;

private String name;

@OneToMany(mappedBy = "system", fetch = FetchType.LAZY)
@JsonIgnore
private List<Customer> customers = new ArrayList<Customer>();

public Long getSystemID() {
    return systemID;
}

public void setSystemID(Long systemID) {
    this.systemID = systemID;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public List<Customer> getCustomers() {
    return customers;
}

public void setCustomers(List<Customer> customers) {
    this.customers = customers;
}
}

Если я вызываю systemDao.merge после system.setName("Test"), то он сохраняется в базе данных. Я чувствую, что мне не нужно вызывать слияние, поскольку это должен быть управляемый объект.

Я пробовал использовать метод замены как с @Transactional, так и без него, и оба они дают одинаковый результат.

Любые идеи?

Спасибо,

  • можете ли вы добавить класс @entity, особенно определение столбцов, которые не вызывают запуск обновления Maciej Kowalski 27.09.2017
  • также не является ли этот метод замены частью какого-либо транзакционного метода более высокого уровня? Maciej Kowalski 27.09.2017
  • обновил ответ, также метод замены является настраиваемым методом, существующим только в созданном мной интерфейсе. Feras Wilson 27.09.2017
  • Вы звоните .save()? Я не думаю, что без вызова .save() или любого другого связанного метода БД будет обновлена. Vikas Prasad 27.09.2017
  • Не могли бы вы предоставить нам класс DAO? Nikolas Charalambidis 27.09.2017
  • Афаик, вам не нужно вызывать сохранение, если оно управляемое. Feras Wilson 27.09.2017

javaspringhibernateentitymanager

Ответы

Ответ 1 · Guenther

Поведение можно объяснить, если SystemDao.findByID() возвращает отсоединенный объект. Убедитесь, что SystemDao не использует RequiresNew-Transaction и не отсоединяет объект явно после его загрузки. Было бы очень полезно, если бы вы разместили код SystemDao и любые соответствующие записи конфигурации (Spring, конфигурация диспетчера объектов, ...).

Ответ 2 · Feras Wilson

Ошибка происходила, когда я запускал свои интеграционные тесты. Оказывается, Transactional ничего не делает, потому что сеанса нет. Решением было добавить Transactional в мои тесты.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы