Hibernate не вставляет внешний ключ ManyToOne - PullRequest
0 голосов
/ 01 марта 2019

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

У меня есть отношения OneToMany и ManyToOne между двумя классами.

@Entity
@Data
public class Bestelling {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @JoinColumn(name = "bestelling_id")
    private long bestellingID;

    private Date bestelDatum;

    @ManyToOne
    @JoinColumn(name = "account_id")
    private Account accountID_fk;

    @JoinColumn(name = "adres_id")
    @OneToOne
    private Adres afleverAdres;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "bestelling")
    private List<Bestellingsregel> bestellingsregels = new ArrayList<>();
}

И

@Entity
@Data
public class Bestellingsregel {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @JoinColumn(name = "bestellingsregel_id")
    private long bestellingsregelID;

    private int aantal;
    private double prijs;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "bestelling_id")
    private Bestelling bestelling;

    @OneToOne
    @JoinColumn(name = "product_id")
    private Product productID;
}

Я использую Почтальон для вставки данных в мою базу данных MySql:

{

"bestelDatum" : "2019-02-28",
"accountID_fk" : {
                    "accountID" : 1 
                },
"afleverAdres" : {
                    "adres_id" : 1
                },
"bestellingsregels" : [
                    { "aantal" : 5,
                      "prijs" : 100.50,
                      "productID" : { "productID" : 1 }
                    }
                    ]
}

Это вставка в базу данных.Единственная проблема состоит в том, что он не устанавливает bestelling_id в таблице Bestellingsregel.Любая идея, что я делаю здесь не так?

Заранее спасибо.

РЕДАКТИРОВАТЬ:

Я использую Spring и функции crud находятся внутри этого интерфейса:

public interface BestellingRepository extends JpaRepository<Bestelling, Long> {
}

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Вы определили отношения между Bestelling и Bestellingsregel как двунаправленные с владельцем (держащим внешний ключ) в Bestellingsregel, что является правильным, но имеет свои плюсы и минусы.

У вас есть следующие опции:

  1. Используйте ваши отношения как определенные и установите объект Bestelling для каждого объекта Bestellingsregel в списке.Bestellingsregel является владельцем, поэтому перед установкой необходимо установить ссылку непосредственно.
  2. Сделайте ваши отношения однонаправленными: удалите ссылку Bestelling из Bestellingsregel и переопределите наши отношения @OneToMany

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, , orphanRemoval = true)
    @JoinColumn(name = "bestelling_id")
    private List<Bestellingsregel> bestellingsregels = new ArrayList<>();
    
0 голосов
/ 01 марта 2019
    Bestelling b = new Bestelling();
    Bestellingsregel br = new Bestellingsregel();
    br.setBestelling(b);
    List<Bestellingsregel> list = new ArrayList<>();
    list.add(br);
    b.setBestellingsregels(list);
    repo.save(b);

Это сработало для меня.Я полагаю, вы не устанавливаете объект Bestelling в объекте Bestellingsregel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...