Если я вручную не установил идентификаторы как для родительского, так и для дочернего объекта, эти объекты создаются как новые записи базы данных, а не как обновления существующих записей.
Так работает каждый поставщик персистентности.
Если поле @Id
сущности не помечено для автоматической генерации провайдером постоянства или базой данных, то наличие нулевого значения заставит провайдера вызвать исключение.Однако, если поле помечено для автоматического создания поставщиком или базой данных, оно пропустит исключение и будет рассматривать объект как новый экземпляр, который необходимо вставить.Только при наличии значения в поле идентификатора будет инициировано обновление существующей строки.
Есть ли лучший способ справиться с этим, чем ручная установка идентификаторов в Java?
Это зависит.
Если полезная нагрузка JSON может предоставить вам значения идентификаторов, вы можете просто сериализовать их в объекты, и процесс сохранения будет работать так же, как вы назначаете их вручную.Это означает, что сущности, имеющие значения идентификаторов, будут обновлены, а те, у которых нет значений, будут вставлены.
Если это неправдоподобный вариант, вам потребуется назначить их, если вы собираетесь использовать @Entity
для представления вашего Accounts
.
Я не уверен, является ли ваша сущность Accounts
ссылкой на что-либо еще в вашей модели данных.Но здесь нужно учитывать одну вещь: насколько мощно @ElementCollection
встраиваемых объектов может очень легко решить вашу проблему с идентификатором:
@Embeddable
public class Accounts implements Serializable {
private Date nextDue;
private Date nextMadeUpTo;
// implement proper equals/hashcode here
}
@Entity
public class Customer {
// your normal things
@ElementCollection
private Set<Accounts> Accounts;
}
Теперь все, что вам нужно сделать, это добавить все данные, которые ваш JSON получает в Accounts
и поместите его в коллекцию элементов.Затем Hibernate позаботится о том, чтобы определить, нужно ли вам что-либо удалять или вставлять, используя таблицу сбора, например, следующим образом:
CUSTOMER_ID | NEXT_DUE | NEXT_MADE_UP_TO
Правильное использование equals
/ hashCode
наAccounts
встраиваемый гарантирует отсутствие дубликатов, он также помогает определить, что изменено или нет.Базовая таблица коллекции теперь использует все поля встраиваемого элемента + первичный ключ Customer
в качестве первичного ключа таблицы.Это позволяет избежать проблемы с суррогатным первичным ключом, используя в качестве данных естественные ключи.