Отображение Hibernate-OneToMany для существующих таблиц БД - PullRequest
0 голосов
/ 22 января 2019

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

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

PT_CORE

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

ST_AUX

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

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

Ниже приведен мой первый класс сущностей (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.
}

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

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

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

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Прежде всего, у вас есть картографическая информация, существующая в вашем 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.

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

0 голосов
/ 22 января 2019

По вашему мнению, владельцем является PtCore, а обратной - StAux.

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

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

 @OneToOne(mappedBy="staux")                       
  private PtCore ptcore;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...