2016-05-15 2 views
1

У меня есть класс POJO:Spring Загрузочный + Hibernate - Как сохранить @Transient поля

@Entity 
@Table(name = "interruttori", catalog = "SMARTPARK") 
public class Interruttore implements java.io.Serializable { 


    private static final long serialVersionUID = 1L; 
    private int idInterruttore; 
    private int numeroInterruttore; 
    private String nomeInterruttore; 
    private String descrizione; 
    private List<Luce> luci; 
    private String pinName; 
    private boolean remoto; 
    private boolean stato; 
    private Date dateTime; 
    private Set<Integer> activeSensors = new HashSet<Integer>(); 
//getters and setters and specifically 
@Transient 
    public Set<Integer> getActiveSensors() { 
     return activeSensors; 
    } 

    public void setActiveSensors(Set<Integer> activeSensors) { 
     this.activeSensors = activeSensors; 
    } 

Это @Transient, потому что я не хочу, чтобы сохраняться Set, я это нужно так же, как «счетчик» в контроллере.

Часть контроллера нам нужен:

@RequestMapping(value="/sensoristica") 
    public ResponseEntity<Sensoristica> findIlluminazione(@RequestParam(value="idLuce") int idLuce, 
                 @RequestParam(value="lit") boolean lit, 
                 @RequestParam(value="suServer") boolean suServer) { 


     Sensoristica sensoristica = new Sensoristica(); 
     Luce luce = luceService.findById(idLuce); 
     String nomeLuce = luce.getNomeLuce(); 
     int numeroLuce = luce.getNumeroLuce(); 
     sensoristica.setLuce(luce); 
     sensoristica.setLit(lit); 
     sensoristicaService.saveSensoristica(sensoristica); 
     logger.debug("Aggiornato sensore " + numeroLuce + " ("+nomeLuce+") acceso: "+lit); 
     //aggiorniamo lo stato del sensore 

     luce.setLit(lit); 
     luceService.updateLuce(luce); 

     //qui gestisco l'interruttore 
     if(suServer){ 

     int idInterruttore = luce.getInterruttore().getIdInterruttore(); 
     Interruttore interruttore = interruttoreService.findById(idInterruttore); 
     Set<Integer> activeSensors = interruttore.getActiveSensors(); 
     logger.debug("Active sensor è " +activeSensors); 
     if(lit){ 
     activeSensors.add(idLuce); 

     logger.debug("Aggiungo id "+idLuce); 
     logger.debug("Active è lungo: "+activeSensors.size()); 
     } else { 
      if (activeSensors.contains(idLuce)){ 
       activeSensors.remove(idLuce); 
       logger.debug("Rimuovo id "+idLuce); 
       logger.debug("Active è lungo: "+activeSensors.size()); 
      } 
     } 
     interruttore.setActiveSensors(activeSensors); 
     interruttoreService.updateInterruttore(interruttore); 
     boolean canShutDown = activeSensors.isEmpty(); 
     logger.debug("canShutDown is "+canShutDown); 

В принципе, я хочу, чтобы добавить или удалить idLuce в набор, а затем проверить, если activeSensors.isEmpty(). Проблема в том, что каждый вызов контроллера возвращает мне пустой набор, а не набор с предыдущими idLuce с внутри. Как я могу его получить?

+0

У вас включен кеширование? –

+1

нет у меня нет этого – besmart

+0

Я не уверен на 100%, но если свойство @Transient временно сохраняет значение, поскольку оно не сохраняется, оно должно храниться где-то, чтобы вы могли получить желаемый результат, так что второй вызов продолжает получать доступ к нему и изменять его. В вашем случае, чтобы 'Interruttore' обновлялся из базы данных и сохранял кешированные значения. Попробуйте использовать кеш и посмотрите, что произойдет ... –

ответ

0

Фактически @Transient следует применять в соответствии с AccessType.

Попробуйте установить @Transient в поле.

@Transient 
private Set<Integer> activeSensors = new HashSet<Integer>(); 
+0

Если я поместил ее в поле, я получаю 'org.hibernate.MappingException: Не удалось определить тип для: java.util.Set, at table: interruttori, для столбцов: [org.hibernate.mapping.Column (active_sensors)] ' – besmart

+0

Попробуйте также использовать аннотацию @Cacheable, которая довольно проста. См. Документацию http://docs.spring.io/spring/docs/3.1.0.RC1/spring-framework-reference/html/cache.html. – shankarsh15