我想使用Java开发CMS,Spring Data / MVC / DI,Hibernate定义类似REST的API。
我有以下模型实体:
Article
s Section
s 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 :(得分:1)
您需要hibernates session.merge(object_name);
我们的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();
}
}
}
如果这不是你想要的,请告诉我,我会删除我的答案。