我有一个实体,它包含两个由同一个实体组成的字段 - 称之为Robot,Human:
@Entity
@Table(name = "robots")
public class Robot
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "rel_robots_humans", joinColumns = {@JoinColumn(name = "robot_id")}, inverseJoinColumns = {@JoinColumn(name = "human_id")})
private Set<Human> humans;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "special_human_id")
private Human specialHuman;
}
两个实体都等于,hashCode基于每个唯一的id。
我有一个网页,其中可以编辑和更改特定机器人的人类和特殊人类。
现在,我试图改变并将特殊的人类价值从机器人的人体内部保存到不同的现有和有效的人类身上。这是从客户端收到的数据传输对象:
public class RobotDTO
{
@NotNull
private Integer id;
private Set<HumanDTO> humans;
private HumanDTO specialHuman;
//getters and setters
}
HumanDTO只包含与RobotDTO相同的ID。 equals和hashCode都很好地实现,并且基于非nullable-id。
使用DozerBeanMapper,我将specialHuman映射到获取的匹配机器人:
ActionResult<Robot> saveRobot(Robot pRobot, RobotDTO pRobotDTO)
{
dozerBeanMapper.map(pRobotDTO, pRobot);
return ActionResultFactory.fromNullable(entityManager.merge(pRobot));
}
最后,问题是
Hibernate感到困惑,并试图将特殊人类插入&#34; rel_robots_humans&#34;表而不是仅仅在机器人表中更新它。 (我检查了十次没有任何变化的人类名单,并且特别人员被推土机适当地设置到了取得的机器人)
当我将specialHuman的类型从Human实体更改为另一个实体时,例如Alien,(具有相同的结构和字段),hibernate正确地进行更新。
我努力寻找这个问题,但没有设法找到有关它的任何信息。
我正在使用:Hibernate 4.3.10.Final(我试图升级到5.0.1.Final但仍然会出现bug),Spring 4.2.3.RELEASE
任何帮助都会非常感激,并会在天堂矩阵中给予帮助。