Я использую 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
позже, поэтому не уверен.