Я пытаюсь присоединиться к Hibernate Entities в сопоставлении OneToOne. Я могу получить данные для данного первичного ключа из основного объекта, однако присоединяемый объект возвращает значение null. Я новичок в спящем режиме, и любая помощь будет оценена по достоинству.
У меня есть две таблицы,
PT_CORE
ST_AUX
Две таблицы заполняются другими приложениями, и моя — операция только для чтения.
Ниже мой первый класс 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, что указывает на то, что соединение не работает должным образом.




В вашем отношении сторона-владелец — 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.
Поэтому вы можете немного уточнить свой вопрос и / или заголовок.
@SauravOjha Возможно, вам придется проверить конфигурацию гибернации на предмет автоматической генерации. Я скоро обновлю свой ответ.
Я получаю следующую ошибку при попытке использовать вышеуказанное решение: ORA-02275: такое ссылочное ограничение уже существует в таблице.