Hibernate的sessionFactory不会从数据库中删除对象

时间:2018-11-21 13:47:36

标签: java spring hibernate spring-mvc

不知道为什么这不起作用!

我正在尝试从数据库中删除凭据,但是delete方法没有帮助...

这就是我的做法:

因此,这是在用户单击页面中的按钮时触发的:

$("#credentialsTable").on('click',"button[id^='del-']",  (e) => {
    var credentialId = e.target.id;
        console.log('credId' + credentialId);
        $.post( "/fisicHost/" + credentialId + "/credentials", data => {
        console.log(data);
    });
});

此控制器的方法正在处理该帖子:

@RestController
public class Controlador {

    @Autowired
    private FisicHostDao fisicHostDao;
    @Autowired
    private CredentialDao credentialDao;

    @RequestMapping(value = "/fisicHost/{id}/credentials", method = RequestMethod.POST)
    public String deleteCredential(@PathVariable(value = "id") String credId){
        String[] parts = credId.split("-");
        int id = Integer.parseInt(parts[1]);
        Credential c = credentialDao.getCredentialById(id);
        credentialDao.delete(c);
        return "justreturnsomething";
    }

}

这是凭据类:

@Entity
public class Credential {

    @Id
    private int id;

    @JsonIgnore
    @ManyToOne(fetch= FetchType.EAGER)
    private FisicHost fisicHost;

    private String user;
    private String password;
    private String notes;
    private String role;

    public Credential(){

    }

    public Credential(int id, FisicHost fisicHost, String user, String password, String notes, String role) {
        this.id = id;
        this.fisicHost = fisicHost;
        this.user = user;
        this.password = password;
        this.notes = notes;
        this.role = role;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public FisicHost getFisicHost() {
        return fisicHost;
    }

    public void setFisicHost(FisicHost fisicHost) {
        this.fisicHost = fisicHost;
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getNotes() {
        return notes;
    }

    public void setNotes(String notes) {
        this.notes = notes;
    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }
}

这是CredentialDao类:

@存储库 公共类CredentialDaoImpl实现CredentialDao {

@Autowired
private SessionFactory sessionFactory;

@Override
public List<Credential> getAllCredentialsByFisicHost(FisicHost fisicHost) {
    // Open a session
    Session session = sessionFactory.openSession();

    Criteria c = session.createCriteria(Credential.class).add(Restrictions.eq("fisicHost.id", fisicHost.getId()));

    List<Credential> allCredentials = c.list();

    // Close the session
    session.close();

    return allCredentials;
}

@Override
public Credential getCredentialByUser(String user) {
    Session session = sessionFactory.openSession();
    Credential credential = session.get(Credential.class, user);
    session.close();
    return credential;
}

@Override
public Credential getCredentialById(int id) {
    Session session = sessionFactory.openSession();
    Credential credential = session.get(Credential.class, id);
    session.close();
    return credential;
}

@Override
public void save(Credential credential) {
    Session session = sessionFactory.openSession();
    session.save(credential);
    session.close();
}

@Override
public void update(Credential credential) {
    Session session = sessionFactory.openSession();
    session.update(credential);
    session.close();
}

@Override
@Transactional
public void delete(Credential credential) {
    Session session = sessionFactory.openSession();
    session.delete(credential);
    session.close();
}

}

好,所以我正在调试程序,当我进入控制器中的这些行时,我看到了:

    Credential c = credentialDao.getCredentialById(id);
    credentialDao.delete(c);

正在加载的凭据是我想要的凭据,但是删除不起作用...凭据没有从数据库中删除。

这是调试器的图片:

enter image description here

我可以看到credentialDao sessionFactory为= null...。这有点奇怪,可能是问题所在吗?如果是这样,如果在CredentialDaoImpl类中将sessionFactory注释为@AutoWired,这将是一个问题!

enter image description here

1 个答案:

答案 0 :(得分:0)

如果您的sessionFactory为空,并且您正在使用@Autowiered批注,则意味着spring上下文无法识别您的依赖关系。 要解决此问题,请创建一个工厂函数,该函数将返回一个新的SessionFactory,然后使用@Bean批注将其作为Bean包含在内。保证春天在上下文中具有依赖性。例如:

@Bean
public HibernateJpaSessionFactoryBean sessionFactory() {
   return new HibernateJpaSessionFactoryBean();
}

然后,您可以使用@Autowired实例化对象。

@Autowired
private SessionFactory sessionFactory;

看一下: https://stackoverflow.com/a/33881946/5192140。 我想那也许可以帮到你