Как включить несоответствующий идентификатор в сопоставление JPA OneToOne

#java #spring-boot #hibernate #jpa #spring-data-jpa

#java #весенняя загрузка #переход в спящий режим #jpa #spring-данные-jpa

Вопрос:

Итак, у меня есть таблица со столбцом, который имеет ссылку на другую таблицу, отличную от внешнего ключа (без фактической ссылки на таблицу), но в другой таблице может не быть соответствующей строки

 class Component {

    @OneToOne(fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = "PART_ID", referencedColumnName="PART_ID", nullable = true, insertable = false, updatable = false)
    @NotFound(action = NotFoundAction.IGNORE)
    private Part part
    @Id
    @Column(name = "COMPONENT_ID")
    private Long id;
} 
  

Класс части

 class Part {

    @Id
    @Column(name = "PART_ID")
    private Long id;
    private String name;
}
  

без этого @NotFound(action = NotFoundAction.IGNORE) я получаю сообщение об ошибке
но при этом я не получаю ошибку и не получаю нулевое значение, но мне нужно, чтобы id присутствовало

например) Я ищу это

 {"component": {"id":12, "part":{"id":100,"name":null}}}
  

но я получаю это (если совпадения нет)

 {"component": {"id":12, "part":null}}
  

но я получаю это (если совпадает)

 {"component": {"id":12, "part":{"id":100,"name":"part_name"}}}
  

Пробовал с nullable=false и некоторыми комбинациями для updatable и insertable , но все равно ничего не работает

Ответ №1:

Если таблица имеет ссылку на другую таблицу, но в другой таблице может не быть соответствующей строки, структура базы данных, вероятно, нарушена.
Вам действительно нужно то, о чем вы просите?

База данных имеет 2 part_id. Один в компоненте, а другой частично. Код Java состоит только из одной части.

Вы можете создать дополнительное поле

 сlass Component {
    private Long partId;
...
  

и в методе @postLoad — создайте новую деталь с желаемым идентификатором.

 @PostLoad
public void postLoad(){
  if(part == null amp;amp; partId!=null){
    part= new Part();
    part.setId(partId)
  }
}
}
  

Комментарии:

1. вы правы, внешнего ключа ссылки на таблицу нет, но нужно объединить их в режиме гибернации, есть ли способ?