SessionFactory Hibernate не удаляет объект из БД - PullRequest
0 голосов
/ 21 ноября 2018

Понятия не имею, почему это не работает !!

Я пытаюсь удалить учетные данные из моей базы данных, но метод удаления не помогает ...

Вот как я 'я делаю это:

Так что это срабатывает, когда пользователь нажимает кнопку на странице:

$("#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";
    }

}

Это класс Credential :

@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 .... это немного странно, возможноэто будет проблема ??Если это так, то почему это проблема, если sessionFactory помечен как @AutoWired в классе CredentialDaoImpl!

enter image description here

1 Ответ

0 голосов
/ 21 ноября 2018

Если ваш sessionFactory имеет значение null и вы используете аннотацию @Autowiered, это означает, что весенний контекст не распознает вашу зависимость.Чтобы решить эту проблему, создайте фабричную функцию, которая возвращает новую SessionFactory и затем включает ее в качестве компонента с помощью аннотации @Bean.Это гарантия весны имеют зависимость в контексте.Пример:

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

Тогда вы можете использовать @Autowired для создания экземпляра вашего объекта.

@Autowired
private SessionFactory sessionFactory;

Взгляните на: https://stackoverflow.com/a/33881946/5192140. Я думаю, что mabe поможет вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...