我使用Hibernate有问题。我有下一个方法:
@Override
public Task assignedUser(Long taskId, Long userId) {
final Task taskBeforeUpdate = taskRepository.findById(taskId);
if (Objects.isNull(taskBeforeUpdate)) {
throw new TaskNotFoundException("Cannot assign, because task with id " + taskId + " was not found");
}
if (!Objects.isNull(taskBeforeUpdate.getUser())) {
throw new BadRequestException("User cannot assigned on task with id " + taskId + " because task already have user ");
}
final User user = userRepository.findById(userId);
final Task assignedTask = taskRepository.assignUser(taskBeforeUpdate.getId(), user.getId());
kafkaSenderTaskProducer.sendUpdatedEvent(assignedTask,taskBeforeUpdate);
return assignedTask;
}
这个方法应该给用户分配任务,并通过TaskBeforeUpdate和TaskAfterUpdate向kafka消费者发送消息。但是当我尝试分配用户时,我的BeforeUpdateTask将他的所有字段更改为TaskAfterUpdate。这行不通,但我不知道他为什么要改变所有的值。
public Task assignUser(Long taskId, Long userId) {
log.debug("AssignUser.E with Task id: {} and User id: {}", taskId, userId);
try {
tx.begin();
Task task = entityManager.find(Task.class, taskId);
User user = entityManager.find(User.class, userId);
task.setUser(user);
final Task updatedTask = entityManager.merge(task);
tx.commit();
if (Objects.isNull(updatedTask)) {
log.warn("AssignUser.X with null");
return null;
}
log.debug("AssignUser.X with Task: {}", updatedTask);
return updatedTask;
} catch (final HibernateException ex) {
tx.rollback();
throw new TaskDAOException("Cannot crate user", ex);
}
}
@Override
public Task findById(Long id) throws TaskDAOException {
log.debug("FindById.E with Task id: {}", id);
tx.begin();
final Task task = entityManager.find(Task.class, id);
tx.commit();
if (Objects.isNull(task)) {
log.warn("FindById.X with null");
return null;
}
log.debug("FindById.X with Task: {}", task);
return task;
}
entitymanager管理所有附加的实体。实体的Id是唯一的。基本上如果你用它的ID加载一个实体两次你会得到相同的对象。不只是一个相等的对象,它们实际上是相同的。
你可以在taskRepository之前从实体管理器中删除taskBeforeUpdate。这应该可以解决问题
entityManager.detach(taskBeforeUpdate);
或者我将taskBeforeUpdate对象映射到另一个不同类的其他对象,然后传递给kafkaSenderTaskProducer。sendUpdatedEvent(数据传输对象)