在Dozer映射之后,我遇到了有关更新数据库中对象的问题。 我在互联网上看了很多,但我找不到任何有同样问题的人。
我的架构:
我有一些DAO和服务层,但它不是我想要关注的内容。
在我的示例中,我有一个Action @ManyToOne映射了一个Segment:
@Entity
class Action {
@Id
Long id;
@ManyToOne
Segment segment;
}
和VO课程:
class ActionVO {
Long id;
SegmentVO segment;
}
这是主要的伪代码(在单个事务中):
Long idAction = 1;
Long idSegment = 2;
Mapper mapper; // Dozer mapper
Action action = findById(idAction);
ActionVO actionVO = new ActionVO;
mapper.map(action, actionVO);
Segment segment = findById(idSegment);
SegmentVO segmentVO = new SegmentVO;
mapper.map(segment, segmentVO);
// here, the segment of the action has the id = 1 : actionVO.getSegment().getId() => 1
actionVO.setSegment(segmentVO);
// here, the segment of the action has the id = 2 : actionVO.getSegment().getId() => 2
mapper.map(actionVO, action);
action = save(action); // throw an hibernate exception
使用更改的Segment属性保存Action时,hibernate会抛出异常,如:
实例的标识符从1更改为2
我知道问题的根源:Dozer映射对象属性而不创建新的(如果存在),因此属性段是具有更新属性的同一对象。所以Hibernate看到Action的Segment对象仍然是相同的,但具有不同的属性值,包括id。 Hibernate尝试更新Segment的主键,这是不允许的。
我的问题是:如何在不改变架构的情况下解决这个问题?如果不可能,一起使用Dozer和Hibernate的最佳做法是什么?
Thx!