Альтернатива для сохранения в JPA / Hibernate с не сгенерированным идентификатором - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь вставить значение в базу данных с типом String в идентификаторе.

@Entity
@Table(name = "xpto_version_map")
public class XptoVersionMap implements Serializable {
    @Id
    @Column(name =  "uniq_name", unique = true, nullable = false)
    private String uniq_name;
...

При попытке сохранить новый XptoVersionMap (), например:

XptoVersionMap xptoVersionMap = new XptoVersionMap();
xptoVersionMap.setUniqName("XPTO-1");
xptoVersionMap.setValue("value2");

xptoVersionMapRepository.save(xptoVersionMap);

кинет:

org.springframework.orm.jpa.JpaObjectRetrievalFailureException: Unable to find xxx.api.database.entity.XptoVersionMap with id XPTO-1; nested exception is javax.persistence.EntityNotFoundException: Unable to find xxx.api.database.entity.XptoVersionMap with id XPTO-1.

Я пробовал разные решения, но если я не могу сделать собственный запрос для вставки значения, я не могу сказать Hibernate, что я хочу просто проверить, существует ли @Id (uniq_name), если нет вставить новое значение и не выдавать исключение.

1 Ответ

0 голосов
/ 03 мая 2018

Так работает Hibernate по умолчанию. Он назначает автоматически сгенерированный идентификатор, когда вы сохраняете метод, и идентификатор не установлен. Если есть идентификатор, он пытается обновить его (что происходит в вашем случае).

save Сохраняет сущность. Назначит идентификатор, если он не существовать. Если кто-то делает, это по сути делает обновление. Возвращает сгенерированный идентификатор сущности.

Вы можете сделать обходной путь, например, используя persist и @ PrePersist

@PrePersist
void generateId() {
    if (uniq_name == null) {
        uniq_name = GENERATE_SOME_UNIQUE_ID_SO_IT_DOESN'T_BREAK();
    }
}

А затем используйте xptoVersionMapRepository.persist (xptoVersionMap);

Или вы можете написать свой собственный генератор с чем-то вроде этого:

@GenericGenerator(name = "my_generator", strategy = "package.CustomGenerator")
@GeneratedValue(generator = "my_generator")

А затем создайте класс CustomGenerator, который реализует IdentifierGenerator, и создайте необходимые методы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...