Dozer + Hibernate更新导致"实例的标识符......"

时间:2015-08-05 08:46:27

标签: java hibernate jpa dozer

在Dozer映射之后,我遇到了有关更新数据库中对象的问题。 我在互联网上看了很多,但我找不到任何有同样问题的人。

我的架构:

  • Hibernate
  • 推土机
  • 模型豆
  • VO bean(完全映射或者映射的DTO bean) 部分模型豆)

我有一些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!

0 个答案:

没有答案