Как обновить отношения с Hibernate? - PullRequest
0 голосов
/ 26 сентября 2019

Я использую MSSQL, и у меня есть Project класс модели с полем

@SuppressWarnings("serial")
@Entity(name = "projects")
public class Projects implements Serializable {
    protected static final String PK = "id";
    @OneToOne(mappedBy = "projects", cascade = CascadeType.ALL)
    private Feasibility feasibility;
...
// getters and setters
}

А также у меня есть Feasibility объект, который выглядит как

@SuppressWarnings("serial")
@Entity(name = "feasibility")
public class Feasibility implements Serializable {

    @Id
    @Column(name = "id")
    private int id;
    @Column(length = 100)
    private String product;
    @Column(name = "launch_date")
    private Timestamp launchDate;
    @Column(length = 40)
    private String status;
    @OneToOne
    @JoinColumn(name = "manager_id", nullable = false)
    private Managers managers;
    @OneToOne
    @JoinColumn(name = "project_id")
    private Projects projects;

// getters and setters
...
}

Также у меня естьстандартные service и dao объекты службы

public class ProjectsService {
    private ProjectDao projectsDao;

    public ProjectsService() {
        projectsDao = new ProjectDao();
    }

    public void persist(Projects entity) {
        projectsDao.getSessionWithTransaction();
        projectsDao.save(entity);
        projectsDao.closeSessionWithTransaction();
    }

    public void update(Projects entity) {
        projectsDao.getSessionWithTransaction();
        projectsDao.update(entity);
        projectsDao.closeSessionWithTransaction();
    }

    public Projects findById(int id) {
        projectsDao.getCurrentSession();
        return projectsDao.findById(id);
    }

    public void delete(int id) {
        projectsDao.getSessionWithTransaction();
        Projects cbd = projectsDao.findById(id);
        projectsDao.delete(cbd);
        projectsDao.closeSessionWithTransaction();
    }

    public List<Projects> findAll() {
        projectsDao.getSessionWithTransaction();
        List<Projects> costingBriefs = projectsDao.findAll();
        projectsDao.closeSessionWithTransaction();
        return costingBriefs;
    }

    public void deleteAll() {
        projectsDao.closeSessionWithTransaction();
        projectsDao.deleteAll();
        projectsDao.closeSessionWithTransaction();
    }
}

DAO

public class ProjectDao implements ActiveRecord<Projects>{
    private Session currentSession;
    private Transaction currentTransaction;

    @Override
    public void save(Projects entity) {
        getCurrentSession().save(entity);
    }

    @Override
    public void update(Projects entity) {
        getCurrentSession().update(entity);
    }

    @Override
    public Projects findById(int id) {
        return getCurrentSession().get(Projects.class, id);
    }

    @Override
    public void delete(Projects entity) {
        getCurrentSession().delete(entity);
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<Projects> findAll() {
        return (List<Projects>) getCurrentSession().createQuery("from projects").list();
    }

    @Override
    public void deleteAll() {
        List<Projects> entities = findAll();
        for(Projects p : entities)
            getCurrentSession().delete(p);
    }

    public Session getCurrentSession() {
        currentSession = getSessionFactory().openSession();
        return currentSession;
    }

    public Session getSessionWithTransaction() {
        currentSession = getSessionFactory().openSession();
        currentTransaction = currentSession.beginTransaction();
        return currentSession;
    }

    public void closeSessionWithTransaction() {
        currentTransaction.commit();
        currentSession.close();
    }

    private static SessionFactory getSessionFactory() {
        Configuration configuration = new Configuration().configure();
        SessionFactory sessionFactory = configuration.buildSessionFactory();
        return sessionFactory;
    }
}

И я могу добавить объект в таблицу с помощью службы, но у меня есть проблемы с обновлением?Я не получаю никаких исключений, поэтому сложнее найти любую проблему.Я погуглил много ответов, но большинство из них предлагают добавить 'cascade = CascadeType.ALL', и в основном они не помогли вообще.Поэтому я решил спросить, что я делаю не так?

Когда я перечисляю данные из модели Feasibility, когда я передаю их в сервисное обновление, я вижу изменения, но они не обновляются в базе данных.

System.out.println("|> " + project.getFeasibility().getProduct()); // I can see here new Product as expected
NewProdForm.getData().getProjectService().update(project);

Так что я не уверенчто я делаю не такЯ не очень хорошо знаю hibernate, но при чтении документации все выглядит просто, но не дает ожидаемого результата.

EDIT Также я хотел бы сказать, что я добавляю в hibernate.cfg.xml строку

<property name="show_sql">true</property>

И только то, что я вижу, это SELECT операторы, не происходит никаких обновлений, почему это так?

EDIT2 Итак, я сначала нашел проблемупроблема была, я просто copy & paste мой код из интернета без, думая, что на самом деле происходит.Вторая проблема, которая решает мою проблему, заключалась в методе getCurrentSession, я открываю новый Session, что приводит меня в замешательство hibernate, я должен изменить его с:

public Session getCurrentSession() {
    currentSession = getSessionFactory().openSession();
    return currentSession;
}

на:

public Session getCurrentSession() {
    currentSession = getSessionWithTransaction(); // CHANGE IN HERE
    return currentSession;
}

И это изменение исправило мою проблему.

Должен ли я удалить сообщение?Я думаю, что может быть полезным для других clumsy позже, поэтому не уверен.

1 Ответ

0 голосов
/ 26 сентября 2019

Вам нужно сначала получить объект проекта по id, чтобы он был загружен в сеансе, а затем сделать необходимые обновления перед сохранением, как показано ниже.

public void update(Projects entity) {
        Project existingProject = projectsDao.findById(entity.getId());
        existingPoject.setAttribute(entity.getAttribute());
        projectsDao.update(existingProject);
    }

Приведенный выше код даст вам представлениеэто не фактический код.

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