Вопрос здесь в том, почему свойства объекта не сохраняются после вызова некоторых сеттеров объекта. Обычно при изменении свойства управляемого объекта оно должно распространяться на базу данных.
Взгляните на этот пример:
@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, так и без него, и оба они дают одинаковый результат.
Любые идеи?
Спасибо,
.save()? Я не думаю, что без вызова.save()или любого другого связанного метода БД будет обновлена. - person Vikas Prasad   schedule 27.09.2017systemзапуститеsystemDao.save(system)(не после внесения изменений вsystem) и дайте мне знать, сохранились ли изменения. - person Vikas Prasad   schedule 27.09.2017findByID(systemID)попробовать толькоfindByName('test')? - person Vikas Prasad   schedule 27.09.2017