Hibernate автоматическое управление версиями не работает (с Spring)
Я пытаюсь использовать автоматическое управление версиями Hibernate, но когда вызывается метод обновления F сеанса, я не вижу поле версии в предложении where запроса и при этом версия не увеличивается в базе данных. Я делаю что-то в корне неправильно, наверное, но что? Вызывает ли проблема вызов getCurrentSession для sesssionFactory?
У меня есть следующий класс сущности:
package dslibweb.model;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Version;
@Entity
@Table(name = "dsXCT_Recalls")
public class DsXCT_Recalls {
@Id
public String recallId;
public int version;
public String status;
//...... more properties.....
@Version
public int getVersion() {
return version;
}
public void setVersion(int version) {
this.version = version;
}
public String getRecallId() {
return recallId;
}
public void setRecallId(String recallId) {
this.recallId = recallId;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}
Мой контроллер:
package recalls.controller;
@Controller
public class RecallsDataController {
@Autowired
RecallsService recallsManager;
@Autowired
AuthenticationService authService;
private static final Logger logger = Logger.getLogger(RecallsDataController.class);
private static final String SAVE_RECALLS = "MODIFY XCT RECALLS";
RecallsGrid recalls;
@RequestMapping(value = "/showRecallsGrid")
@ResponseBody
public RecallsGrid showRecallsGrid( HttpSession session, HttpServletResponse response) {
recalls = recallsManager.getRecallsDataGrid((String) session.getAttribute("socketToken"), new GridFilters(0, 0, "", "", "", "", ""));
if (recalls.getError() == null || recalls.getError().equals("")) { // no error
return recalls;
} else {
try {
response.sendError(HttpServletResponse.SC_BAD_REQUEST, recalls.getError());
} catch (IOException e) {
e.printStackTrace();
}
return recalls;
}
}
@RequestMapping(value = "/saveRecalls" , method= RequestMethod.POST)
@ResponseBody
public String saveRecalls( HttpSession session, @RequestParam(value="ids[]", required = false) String [] ids, @RequestParam(value="statuses[]", required = false) String [] statuses){
boolean result = authService.validateUserAction((String) session.getAttribute("socketToken"), SAVE_RECALLS);
if(result)
return recallsManager.saveRecalls(ids, statuses, recalls);
else
return "You do not have authority to perform this action.";
}
}
Где я получаю коллекцию DsXCT_Recalls и показываю их пользователю. Коллекция хранится в контроллере. Затем пользователь изменяет статус в одной или нескольких сущностях, и я вызываю метод saveRecalls в revManager, который создает список только измененных сущностей (по сравнению с коллекцией, хранящейся в контроллере).
Напомним, Менеджер (сервисный уровень):
package recalls.service.defaultimpl;
@Service("recallManager")
public class HibernateRecallsDataService implements RecallsService {
@Autowired
JsonRpcRequest jsonReq;
@Autowired
JsonRpcSocketWriterReader socketWriterReader;
@Autowired
JsonRpcRequestConstructor reqConstructor;
@Autowired
RecallsDao hibernateRecallsDao;
private static final Logger logger = Logger.getLogger(HibernateRecallsDataService.class);
@Transactional
public RecallsGrid getRecallsDataGrid(String socketToken, GridFilters filters) {
List<DsXCT_Recalls> recalls = hibernateRecallsDao.findRangeOfRecordsFiltered(filters);
return new RecallsGrid(recalls);
}
@Transactional()
public String saveRecalls(String[] ids, String[] statuses, RecallsGrid recalls) {
List<DsXCT_Recalls> recallList = recalls.getRecalls();
List<DsXCT_Recalls> updatedRecallList = new ArrayList<DsXCT_Recalls>();
for (int i = 0; i < ids.length; i++) {
for (DsXCT_Recalls recall : recallList) {
if (recall.recallId.equals(ids[i])) { // recall is found in the list
if (!statuses[i].equals(recall.getStatus())) { // status has changed
recall.setStatus(statuses[i]);
updatedRecallList.add(recall);
}
}
}
}
return hibernateRecallsDao.saveAll(updatedRecallList);
}
}
Метод saveAll в моем DAO вызывает один метод обновления сеанса гибернации для объекта:
package recalls.dao.hibernate;
@Repository
public class HibernateRecallsDao implements RecallsDao {
@Autowired(required = true)
@Resource(name = "mySessionFactory")
private SessionFactory sessionFactory;
@SuppressWarnings("unchecked")
public List<DsXCT_Recalls> findRangeOfRecordsFiltered(GridFilters filters) {
return sessionFactory.getCurrentSession().createQuery("from DsXCT_Recalls r WHERE SID = 0 ORDER BY Org, Bank, BIC, SetlDate").list();
}
public String saveAll(List<DsXCT_Recalls> recallList){
int count = 0;
for(DsXCT_Recalls recall:recallList){
sessionFactory.getCurrentSession().update(recall);
count++;
}
return count + " recalls were modified.";
}
}
1 ответ
Так что, очевидно, @Version должен быть выше объявления атрибута, а не выше метода getter. Я уверен, что где-то видел это. Столько времени потрачено впустую:(