2015-11-20 27 views
1

我想开发一个使用Java,Spring Data/MVC/DI,Hibernate定义类似REST的API的CMS。Hibernate更新对象的非引用字段

我有以下的模型实体:

  • 有多个Article小号
  • 每篇文章都有多个Section小号
  • 每个部分可以有小节和/或Item

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

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

  • /articles - 创建一个文章,无节
  • /articles/{article_id} - 更新基本款性质,不影响部分
  • /articles/{article_id}/sections - 创建文章中的一段
  • 删除/articles/{article_id}/sections/{section_id} - 删除文章中的部分
  • /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); 
} 
+0

Hibernates合并方法将为您做到这一点。 –

+0

@WeareBorg - 你能联系我吗?随意张贴一个答案 –

+0

你在寻找类似http://dozer.sourceforge.net/documentation/about.html还是http://orika-mapper.github.io/orika-docs/intro.html? –

回答

1

您需要hibernates session.merge(object_name);

链接:From Hibernate docs

从我们的web应用程序的编辑功能的例子:

@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(); 
      } 
     } 
    } 

如果这不是你在找什么,请让我知道,我会删除我的答案。

+0

因此,在这个会话中,我必须重置所有关系字段,而不是所有基本属性。不过,对我来说不是最好的情况,因为我想创建一个通用的方法来解决我所有的关系。不过,请保留答案 - 我相信这很有用。 –

+0

您不需要重置所有关系字段......假定这种情况,您调用与其他人关联的对象,调用其getById(int id);.然后你编辑了对象,改变了其他的东西,然后primary_key。然后你可以直接调用session.merge(object_name),你的关系会被保留。 –

+0

我正在重置关系,因为我们的前端代码有时会创建要编辑的对象(不要问,长话短说)......这就是为什么我必须重置它们。得到它了? –

相关问题