Hibernate更新对象

时间:2015-11-20 09:51:17

标签: java spring hibernate rest

我想使用Java开发CMS,Spring Data / MVC / DI,Hibernate定义类似REST的API。

我有以下模型实体:

  • 有多个Article s
  • 每篇文章都有多个Section s
  • 每个部分都可以包含子部分和/或Item

所有这些实体都有自己的属性(例如名称,类型等),但很明显它们指的是它们的聚合实体。我需要为每个这样的实体定义CRUD API方法。

我决定偏离教条式REST,当我修改时,我只需要传入特定于实体的属性(如名称,类型等),但不会影响聚合。因此,我有端点,如:

  • 发布/articles - 创建一篇文章,没有任何内容
  • put /articles/{article_id} - 更新基本文章属性,不影响各个部分
  • 发布/articles/{article_id}/sections - 在文章
  • 中创建一个部分
  • 删除/articles/{article_id}/sections/{section_id} - 从文章
  • 中删除该部分
  • put /articles/{article_id}/sections/{section_id} - 更新基本部分属性,不影响拥有文章属性,也不影响聚合部分和项目
  • 等...

所以我的问题是:

当我收到修改请求时,我会获得该元素的所有基本属性以及拥有实体标识符。如何有效地将它们与数据库中的现有关系结合起来,这样我就可以保留所有这些关系并修改基本属性,而无需逐个复制所有属性。以下是文章部分关系的示例。

public void modifySection(int articleId, int sectionId, Section section) {
    assert(article.owns(sectionId));
    Section dbSection = sectionDao.findOne(sectionId);
    copyOverProperties(section, dbSection); // this is the thing I do not know how to do
    sectionDao.save(dbSection);
}

1 个答案:

答案 0 :(得分:1)

您需要hibernates session.merge(object_name);

链接:From Hibernate docs

我们的webapp的编辑功能示例:

   @Repository
    public class GroupCanvasDAOImpl implements GroupCanvasDAO {

        private final SessionFactory sessionFactory;

        @Autowired
        public GroupCanvasDAOImpl(SessionFactory sessionFactory) {
            this.sessionFactory = sessionFactory;
        }
    @Override
        public void editGroupCanvas(GroupCanvas groupCanvas) {
            Session session = this.sessionFactory.getCurrentSession();
            GroupCanvas groupCanvas1 = (GroupCanvas) session.get(GroupCanvas.class, groupCanvas.getMcanvasid());

//  Below 2 steps are not necessary if object was retrieved from DB and //then persisted back-again. If it was newly created to replace an //old-one, then the below 2 lines are needed.
    groupCanvas.setGroupAccount(groupCanvas1.getGroupAccount());
                groupCanvas.setCanvasowner(groupCanvas1.getCanvasowner());
                session.merge(groupCanvas);
                session.flush();
            }
        }
    }

如果这不是你想要的,请告诉我,我会删除我的答案。