Сопоставление Hibernate-OneToMany для существующих таблиц БД

Я пытаюсь присоединиться к Hibernate Entities в сопоставлении OneToOne. Я могу получить данные для данного первичного ключа из основного объекта, однако присоединяемый объект возвращает значение null. Я новичок в спящем режиме, и любая помощь будет оценена по достоинству.

У меня есть две таблицы,

PT_CORE

  • Первичный ключ: ptId — целое число;
  • Внешний ключ: stId(ST_AUX) — целое число;
  • Столбцы: ptId, ptName

ST_AUX

  • Первичный ключ: stId;
  • Столбцы: stId, stName

Две таблицы заполняются другими приложениями, и моя — операция только для чтения.

Ниже мой первый класс Entity (PtCore.java)

@Entity
@Table(name = "PT_CORE")
public class PtCore implements Serializable{

    @Id
    @Column(name = "ptId", nullable = false)
    private int id; 

    @Column(nullable=false)
    private int stId;  //The Foreign key column

    @OneToOne
    @JoinTable( name = "core_aux", joinColumns = {@JoinColumn(Name = "ptId")},
                    inverseJoinColumns = {@JoinColumn(Name = "stId")}
                )
    private StAux staux;

    //Getters, setters and toString() for above 
}

StAux — это еще одна сущность, определенная ниже:

@Entity
@Table(name = "ST_AUX")
public class StAux implements Serializable {

    @Id
    @Column(nullable=false)
    private Integer stId;

    @OneToOne                       
    private PtCore ptcore;

    @Column
    private String stName;
    //Getters, Setters and toString follow.
}

Я делаю ниже в сервисном методе:

PtCore obj = (PtCore) session.get(PtCore.class,1);
System.out.println(obj);

В результатах я получаю значение ptName, но переменные класса stAux имеют значение null, что указывает на то, что соединение не работает должным образом.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
633
2

Ответы 2

В вашем отношении сторона-владелец — PtCore, обратная сторона — StAux.

В двунаправленных отношениях OneToOne обратная сторона должна иметь атрибут mappedBy. На самом деле атрибут mappedBy содержит имя поля-ассоциации на стороне-владельце.

Итак, вы должны изменить свой обратный код (StAux Entity). Вы должны добавить атрибут mappedBy к @OneToOne в классе StAux:

 @OneToOne(mappedBy = "staux")                       
  private PtCore ptcore;

Прежде всего, у вас есть информация о сопоставлении, существующая в вашем PT_CORE. И я предполагаю, что это что-то вроде FOREIGN KEY (stid) REFERENCES (stid). Если вы хотите использовать существующую схему и существующие данные, я думаю, что действительно не существует таблицы сопоставления core_aux. По крайней мере, вы не упомянули об этом. Однако это видно как аннотацию @JoinTable, но все же есть этот вышеупомянутый внешний ключ, который кажется реальным сопоставлением (поэтому снова не таблица соединений).

Я предлагаю следующее

удали это

@Column(nullable=false)
private int stId;  //The Foreign key column

с вашего PtCore. Я думаю, что это не нужно. Также в PtCore удалите @JoinTable (потому что я сказал выше) и добавьте информацию о сопоставлении в аннотацию @OneToOne, например:

@OneToOne
@JoinColumn(name = "stid")
private StAux staux;

с вашего PT_CORE.

Затем в StAux также немного изменить:

@Id
@Column(name = "stid") // this might not be needed but if there is like "st_id"...
private Integer stId;  // so just for sure

@OneToOne(mappedBy = "staux") 
private PtCore ptcore;

Поскольку у вас есть существующие таблицы и ограничения, могут возникнуть ошибки, если hibernate попытается автоматически сгенерировать их снова с помощью инструкций JPA.

Проверьте это например для получения дополнительной информации.

ОБНОВИТЬ: только что понял, что у тебя в заголовке @OneToMany, а в коде @OneToOne.

Поэтому вы можете немного уточнить свой вопрос и / или заголовок.

Я получаю следующую ошибку при попытке использовать вышеуказанное решение: ORA-02275: такое ссылочное ограничение уже существует в таблице.

Saurav Ojha 23.01.2019 08:02

@SauravOjha Возможно, вам придется проверить конфигурацию гибернации на предмет автоматической генерации. Я скоро обновлю свой ответ.

pirho 23.01.2019 08:33

Другие вопросы по теме

Похожие вопросы

Future.cancel(), за которым следует Future.get(), убивает мой поток
Кнопка «Удалить» в recyclerview неправильно расположена на некоторых картах Android
Десериализатор Джексона выдает JsonParseException с недопустимым средним байтом UTF-8, в то время как строка десериализатора с акцентами
Сложность времени — копирование записей карты в список массивов
Почему netty выдает исключение UnknownHostException, даже если получает ответы от серверов имен?
Как узнать ближайшее местоположение LatLng из базы данных Firebase в реальном времени, используя облачную функцию Firebase в NodeJS
Как сделать так, чтобы приложение для Android не открывалось через определенный промежуток времени?
Я получаю ответ 500 при попытке сделать ajax-вызов службы отдыха, передав параметры
Ошибка создания bean-компонента с именем «sessionRepositoryFilterRegistration», определенным в ресурсе пути к классу
Программно сбросить перспективу в чистом приложении e4