Java 弹簧靴&x2B;Hibernate-如何维护@Transient字段

Java 弹簧靴&x2B;Hibernate-如何维护@Transient字段,java,spring,hibernate,Java,Spring,Hibernate,我有一门POJO课程: @Entity @Table(name = "interruttori", catalog = "SMARTPARK") public class Interruttore implements java.io.Serializable { private static final long serialVersionUID = 1L; private int idInterruttore; private int numeroInterrut

我有一门POJO课程:

@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;
    }
@实体
@表(name=“interruttori”,catalog=“SMARTPARK”)
公共类Interruttore实现java.io.Serializable{
私有静态最终长serialVersionUID=1L;
特鲁托私人酒店;
私有整数;
私用字符串;
私有字符串描述;
私人名单;
私有字符串pinName;
私有布尔remoto;
私有布尔stato;
私人日期时间;
私有集activeSensors=new HashSet();
//接受者和接受者,特别是
@短暂的
公共集getActiveSensors(){
返回传感器;
}
public void setActiveSensors(设置activeSensors){
this.activeSensors=activeSensors;
}
它是@Transient的,因为我不想持久化这个集合,我需要它就像控制器中的“计数器”一样

我们需要的控制器部分是:

@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);
@RequestMapping(value=“/sensoristica”)
公共响应findiluminizione(@RequestParam(value=“idLuce”)intidluce,
@RequestParam(value=“lit”)布尔值为lit,
@RequestParam(value=“suServer”)布尔值suServer){
Sensoristica Sensoristica=新的Sensoristica();
Luce-Luce=luceService.findById(idLuce);
字符串nomeLuce=luce.getNomeLuce();
int numeroLuce=luce.getNumeroLuce();
塞特卢斯感觉学(luce);
感觉学。设置照明(照明);
sensoristicaService.saveSensoristica(sensoristica);
logger.debug(“Aggiornato传感器”+数值+”(“+nomeLuce+”)acceso:“+lit”);
//阿吉奥尼亚莫-斯塔托-德尔传感器酒店
卢斯·塞利特(利特);
luceService.updateLuce(luce);
//我想问一下
如果(suServer){
int iditerruttore=luce.getInterruttore().getiditerruttore();
Interruttore Interruttore=interruttoreService.findById(iditerruttore);
设置activeSensors=interruttore.getActiveSensors();
调试(“主动传感器è”+主动传感器);
如果(点亮){
activeSensors.add(idLuce);
logger.debug(“Aggiungo id”+idLuce);
debug(“Activeèlungo:+activeSensors.size());
}否则{
if(activeSensors.contains(idLuce)){
主动传感器。移除(idLuce);
logger.debug(“Rimuovo id”+idLuce);
debug(“Activeèlungo:+activeSensors.size());
}
}
interruttore.setActiveSensors(activeSensors);
interruttoreService.updateInterruttore(interruttore);
布尔值canShutDown=activeSensors.isEmpty();
logger.debug(“canShutDown是”+canShutDown);
基本上,我想在集合中添加或删除
idLuce
,然后检查
activeSensors.isEmpty()
。 问题是每次对控制器的调用都会返回一个空集,而不是一个包含上一个
idLuce
s的集合。
如何获得它?

实际上,应根据AccessType应用@Transient

请尝试将@Transient设置为字段

@Transient
private Set<Integer> activeSensors = new HashSet<Integer>();
@Transient
私有集activeSensors=new HashSet();

实际上,应根据访问类型应用@Transient

请尝试将@Transient设置为字段

@Transient
private Set<Integer> activeSensors = new HashSet<Integer>();
@Transient
私有集activeSensors=new HashSet();

您启用了缓存吗?不,我没有启用缓存。不幸的是,瞬态对象没有保存在二级缓存中……我想我必须改变方法。我知道,如果您使用缓存,有一件事对您真正有帮助。然而,这是一个不太好的解决方案,因为它是缓存方法调用,尽管实际上您可以执行缓存你可以考虑的另一个解决方案是,如果你使用注入服务,并让它们存储你需要缓存的变量。@ JoaoEsperancinha,我想我会用一个映射来存储我的变量,你是否已经启用了缓存?不,我不知道瞬态对象没有保存在第二级缓存中。不幸的是,我想我必须改变方法。我知道,如果你使用的话,我会真正帮助你。然而,这是一个不太好的解决方案,因为它是缓存方法调用,虽然实际上你可以用它做你想做的事情。你可以考虑的另一个解决方案是,如果你使用注入服务,使它成为ST。或者您需要缓存的变量。@JoaoEsperancinha我想我会使用带有映射的注入来存储我的变量,谢谢如果我把它放在我得到的字段中,
org.hibernate.MappingException:无法确定类型:java.util.Set,在表:interruttori,列:[org.hibernate.mapping.Column(active_)]
尝试使用@Cacheable注释,这非常简单。如果我把它放在我得到的字段中,请参阅文档
org.hibernate.MappingException:无法确定类型:java.util.Set,在table:interruttori,列:[org.hibernate.mapping.Column(活动传感器)]
尝试使用@Cacheable注释,这非常简单。请参阅文档