2016-10-03 4 views
1

Я пытаюсь изучить Hibernate с помощью этого простого примера, но у меня такая проблема с внешним ключом, который остается «нулевым» в базе данных.Hibernate не устанавливает внешний ключ

@Entity 
@Table(name = "tb1") 
public class Track { 
    @Id 
    @GeneratedValue(strategy= GenerationType.IDENTITY) 
    @Column(name="id_tb1", unique= true) 
    private int id_tb1; 
    @Column(name = "title") 
    private String title; 
    @ManyToOne 
    @JoinColumn(name="id_tb2") 
    private tb2 cd; 

И это второй класс

@Entity 
@Table(name = "tb2") 
public class CD { 

    @Id 
    @GeneratedValue(strategy= GenerationType.IDENTITY) 
    @Column(name="id_tb2", unique = true) 
    private int id_tb2; 
    @Column(name="title") 
    private String title; 
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL,mappedBy = "cd") 
    private List<tb1> tracks = new ArrayList<tb1>(); 

сохраняю как это:

SessionFactory factory = new Configuration().configure("/resources/hibernate.cfg.xml").buildSessionFactory(); 
       Session session1 = factory.openSession(); 
       session1.beginTransaction(); 
       session1.save(tb2); 
       session1.getTransaction().commit(); 

но когда Isavethe id_tb2 (в таблице ТВ1) не установлен, и он остается пустым. Что мне не хватает?

+0

Какой тип треков в классе CD. ТВ1? добавьте весь код. –

+0

Я предполагаю, что его частный Список tracks = new ArrayList (); в классе CD вместо частного списка tracks = new ArrayList (); –

+0

@RohitGaikwad да! – untruste

ответ

2

Проблема вы должны установить связь с обеих сторон для двунаправленной связи.

Таким образом, вы должны установить свои отношения для CD и вашего объекта Track и продолжить/слить их впоследствии.

Не видя большей части вашего кода, вам нужно что-то делать.

cd.getTracks().add(track); 
track.setCD(cd); 
session1.save(track); 
session1.save(cd); 

Для получения более подробной информации см. another question.

+0

Спасибо, человек! У меня уже был метод setTb2, но когда я сохранял объект tb2 в базе данных, я не вызывал его, так что это была проблема! – untruste

+0

Вы также можете использовать аннотацию каскада для сохранения или объединения связанного объекта неявно, см. Https://vladmihalcea.com/2015/03/05/a-beginners-guide-to-jpa-and-hibernate-cascade-types/ для больше информации. –

+1

, чтобы иметь FK, заполненную в БД, вам нужна только сторона, владеющая взаимозависимой связью. (Однако вы все равно должны использовать обе стороны не из-за Hibernate, а только из-за согласованности сущностей) –

1

Я думаю, что ваш тип table2

private tb2 cd; 

должен быть изменен как

private CD cd; 
+0

thats a nice catch –

+0

Я не верю, что это ошибка. Потому что, если бы это был код, он даже не компилировался. Но это не проблема, с которой сталкивается OP. –

Смежные вопросы