Как избавиться от нарушения нулевого ограничения внешнего ключа при создании новой записи - PullRequest
0 голосов
/ 20 мая 2019

У меня проблема, которой у меня никогда не было.В основном у меня есть 2 объекта: Orders и Recip (и соответствующие им классы Java).Между ними есть отношение @OneToMany (Рецепту принадлежит отношение) и @ManyToOne (в Заказах).Логика этого отношения - создать новый ордер, вставив FK (rece_id) в запись.Проблема, которая возникает, заключается в том, что я могу делать такую ​​логику с помощью SQL-запросов, но это невозможно при совместном использовании Angular и Spring.Мой код выглядит так: Приказы:

package tk.jewsbar.jwtauth.app.model;

import com.fasterxml.jackson.annotation.*;

import javax.persistence.*;
import java.sql.Timestamp;

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property="@orders_id")
@JsonInclude(JsonInclude.Include.NON_NULL)
@Entity
public class Orders {


    @Id
    @GeneratedValue
    private Long orders_id;

    @Basic
    private Timestamp date;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)


    @JoinColumn(name = "recip_recip_id", nullable = false)



    public Recip recip;

    public Long getOrders_id() {
        return orders_id;
    }

    public void setOrders_id(Long orders_id) {
        this.orders_id = orders_id;
    }

    public Timestamp getDate() {
        return date;
    }

    public void setDate(Timestamp date) {
        this.date = date;
    }

    public Recip getRecip() {
        return recip;
    }

    public void setRecip(Recip recip) {
        this.recip = recip;
    }
}

Рецепт:

package tk.jewsbar.jwtauth.app.model;

import com.fasterxml.jackson.annotation.*;

import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.util.Set;

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property="@recip_id")
@JsonInclude(JsonInclude.Include.NON_NULL)
@Entity
@Table(name = "recip")

public class Recip  {

    @Id
    @GeneratedValue
    public Long recip_id;

    @NotNull
    private double quantity;

    @NotNull
    private double price;

    private double quantity_item;

    private String name;



    @OneToMany(mappedBy = "recip", cascade = CascadeType.ALL, fetch = FetchType.LAZY)

    private Set<Orders> orders;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)

    @JoinColumn(name = "storeitem_storeitem_id", nullable = false)


    private StoreItem storeItem;

    public Long getRecip_id() {
        return recip_id;
    }

    public void setRecip_id(Long recip_id) {
        this.recip_id = recip_id;
    }

    public double getQuantity() {
        return quantity;
    }

    public void setQuantity(double quantity) {
        this.quantity = quantity;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public double getQuantity_item() {
        return quantity_item;
    }

    public void setQuantity_item(double quantity_item) {
        this.quantity_item = quantity_item;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    public Set<Orders> getOrders() {
        return orders;
    }

    public void setOrders(Set<Orders> orders) {
        this.orders = orders;
    }

    public StoreItem getStoreItem() {
        return storeItem;
    }

    public void setStoreItem(StoreItem storeItem) {
        this.storeItem = storeItem;
    }
}

И Угловой copmonent.ts:

        orders: Orders[];
    recips: Recip[];
    order: Orders = new Orders();

  constructor(
    private route: ActivatedRoute,
    private ordersService: OrdersService,
    private router: Router,
    ) { }


    ngOnInit() {
      this.ordersService.getRecips().subscribe(
        data => {
       this.recips = data;
     });
    }
  ifShow() {
    this.show = !this.show;
  }
  createOrders(): void {
    this.ordersService.addOrders(this.order)
        .subscribe( data => {

          window.location.reload();
        });
         console.log('recip_ID: ' + this.order['recip_id']);
         console.log(this.order);

  }
  }

Наконец component.html:

<select class="form-control" [(ngModel)]="order" placeholder="id" name="id" id="id">
  <option *ngFor="let item of recips" 
         [ngValue]="item">
      {{ item.name }}             
  </option>
</select>


<br><br><br>
<button class="btn btn-success" (click)="createOrders()">Save</button>

Ошибка, которую я получаю:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Столбец 'receive_recip_id' не может быть нулевым

Я не понимаю, потому что "rec_recip_id" - это значение, которое я вставляю в таблицу (другие столбцы в таблице "Orders" являются AI или могут быть нулевыми)

...