Вы должны пропустить. Для вашего конкретного случая:
db.person.find().snapshot().forEach(
function (elem) {
db.person.update(
{
_id: elem._id
},
{
$set: {
name: elem.firstname + ' ' + elem.lastname
}
}
);
}
);
У вас есть недостаток дизайна в вашем столе или картировании.
Ваше отображение говорит, {LINKID, FROMHIERARCHY, FROMNODE}
является первичным ключом (PK) сущности HLink. Но, напротив, ваша схема позволяет вставлять несколько записей, имеющих одинаковую комбинацию {LINKID, FROMHIERARCHY, FROMNODE}
, что подтверждается вашим необработанным ответом на запрос SQL. Вы должны определить уникальный индекс или первичный ключ для {LINKID, FROMHIERARCHY, FROMNODE}
.
В качестве альтернативы вы не должны лгать Hibernate, говоря ей, что это был первичный ключ - это просто не так.
Почему объекты дублируются?
blockquote>Когда Hibernte читает ответ на запрос SQL, для каждой строки с различными значениями PK он создает новый объект-объект HLink. Hibernate читает
130 1 3743 30 8
и создает экземпляр для недавно обнаруженной PK PK{130, 1, 3743}
, помещая этот экземпляр сущности в кэш сеанса l1. Для обеих дополнительных записей Hibernate распознает: «О, у меня уже есть эта сущность с PK{130, 1, 3743}
в кеше, поэтому мне не нужно проверять полную запись результата, а просто снова добавить кэшированный экземпляр в список результатов запроса». [1112 ]Редактировать:
Чтобы решить эту проблему, вы можете добавить PK в структуру таблицы и отобразить его как
@Id
, либо найти уникальную комбинацию столбцов и отобразить ее как составной идентификатор как Вы уже сделали с не уникальной комбинацией столбцов. Hibernate, кажется, не работает без Id, поскольку ответ на этот вопрос гласит .