Почему этот Hibernate Relation не работает? - PullRequest
1 голос
/ 30 июня 2019

Я пытаюсь соединить пиццу и ингредиенты в соотношении n: m, в то время как все пиццы имеют ингредиенты в качестве списка атрибутов ингредиентов. Но в Связной таблице, когда я создаю новую Пиццу и пытаюсь зафиксировать, есть Ошибка с PizzaID в Связной таблице.

Реляционная таблица:

CREATE TABLE `Pizza_Ingredience_Relation` (
  `PizzaID` int(11) NOT NULL,
  `IngredientID` int(11) NOT NULL,
  `Amount` int(11) NOT NULL,
  `Volume_Unit` varchar(1) NOT NULL,
  PRIMARY KEY (`PizzaID`,`IngredientID`),
  KEY `FKc58en2gx5a8n1swmu9tda345` (`IngredientID`),
  CONSTRAINT `FK_IngredienceId` FOREIGN KEY (`IngredientID`) REFERENCES `Zutatenliste` (`ID`),
  CONSTRAINT `FKc58en2gx5a8n1swmu9tda345` FOREIGN KEY (`IngredientID`) REFERENCES `Zutatenliste` (`ID`),
  CONSTRAINT `FKhghfxg8raskdydyu8o8msxtfn` FOREIGN KEY (`PizzaID`) REFERENCES `Pizza` (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

Таблица ингредиентов:

CREATE TABLE `Zutatenliste` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Name` varchar(20) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

Стол для пиццы:

CREATE TABLE `Pizza` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Name` varchar(20) NOT NULL,
  `PreisKlein` double NOT NULL,
  `PreisMittel` double NOT NULL,
  `PreisGroß` double NOT NULL,
  `PreisFamilie` double NOT NULL,
  PRIMARY KEY (`ID`),
  UNIQUE KEY `ID` (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

У меня есть два спящих субъекта, один из них - пиццерия, а другой - ингредиент:


package Model.PizzenDB.SQLConnectionClasses.MySQL;

import Model.PizzenDB.Pizza;
import org.hibernate.annotations.CollectionId;
import org.hibernate.annotations.Where;

import javax.persistence.*;
import java.util.LinkedList;
import java.util.Set;

@Entity
@Table(name = "Pizza")
public class MySQLPizzaHibernateEntity {
    @Id
    @Column(name = "ID")
    private int id;
    @Column(name = "Name")
    private String name;
    @Column(name = "PreisKlein")
    private double smallPrice;
    @Column(name = "PreisMittel")
    private double middlePrice;
    @Column(name = "PreisGroß")
    private double bigPrice;
    @Column(name = "PreisFamilie")
    private double familyPrice;
    @ManyToMany(cascade = { CascadeType.ALL })
    @JoinTable(
            name = "Pizza_Ingredience_Relation",
            joinColumns = { @JoinColumn(name = "PizzaID",          referencedColumnName = "ID") },
            inverseJoinColumns = { @JoinColumn(name = "IngredientID") }
    )
    private Set<MySQLIngredientWithAmountHibernateEntity> ingredience;

    public MySQLPizzaHibernateEntity(String name, double smallPrice,            double middlePrice, double bigPrice, double familyPrice) {
        this.name = name;
        this.smallPrice = smallPrice;
        this.middlePrice = middlePrice;
        this.bigPrice = bigPrice;
        this.familyPrice = familyPrice;
    }

    public MySQLPizzaHibernateEntity() {
    }



}

@Entity
@Table(name = "Zutatenliste")
@SecondaryTable(name = "Pizza_Ingredience_Relation", pkJoinColumns = @PrimaryKeyJoinColumn(name = "IngredientID", referencedColumnName = "ID"))
public class MySQLIngredientWithAmountHibernateEntity {

    @Id
    @Column(name = "ID")
    private int id;
    @Column(name = "Name")
    private String name;
    @Column(table = "Pizza_Ingredience_Relation", name="Amount")
    private int amount;
    @Column(table = "Pizza_Ingredience_Relation", name = "Volume_Unit")
    private char unit;

    public MySQLIngredientWithAmountHibernateEntity(String name) {
        this.name = name;
    }

    public MySQLIngredientWithAmountHibernateEntity() {
        this("");
    }
}

Я получаю следующее сообщение об ошибке:

20:41:45 [main] [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] ERROR - Field 'PizzaID' doesn't have a default value
20:41:45 [main] [org.hibernate.internal.ExceptionMapperStandardImpl] ERROR - HHH000346: Error during managed flush [org.hibernate.exception.GenericJDBCException: could not execute statement]

Я не уверен, что не так подробно, я думаю, что это связано с внешним ключом PizzaID и что он не установлен должным образом.

Ответы [ 2 ]

1 голос
/ 01 июля 2019

Для отношений «многие ко многим» вы используете среднюю таблицу с дополнительными столбцами, и вам нужен ключ Embeddable для того, что будет состоять из объекта Pizza и Ingredient (сокращенные имена). Что-то вроде:

@Embeddable
public class PizzaIngredientPk {
    private MySQLPizzaHibernateEntity pizza;
    private MySQLIngredientWithAmountHibernateEntity ingredient;

    @ManyToOne
    public MySQLPizzaHibernateEntity getPizza() {
        return pizza;
    }
    public void setPizza(MySQLPizzaHibernateEntity pizza) {
        this.pizza = pizza;
    }

    @ManyToOne
    public MySQLIngredientWithAmountHibernateEntity getIngredient() {
        return ingredient;
    }
    public void setIngredientID(MySQLIngredientWithAmountHibernateEntity ingredient) {
        this.ingredient = ingredient;
    }
}

Тогда это будет действовать как встроенный ключ в MySQLIngredientWithAmountHibernateEntity как

    @EmbeddedId
    PizzaIngredientPk pk = new PizzaIngredientPk();

Но это не будет работать с Secondarytable, который используется для отношений один-к-одному. @SecondaryTable требует, чтобы отображение было с первичным ключом, но в этом случае Embedded ID станет PK. На самом деле, у вас есть недостаток в вашем дизайне. Вы пытаетесь сделать одну из своих отношений многих со многими как один-к-одному.

Согласно документам JPA При использовании аннотации EmbeddedId должна быть только одна аннотация EmbeddedId и не должна быть Id.

0 голосов
/ 30 июня 2019

Попробуйте указать, чтобы Hibernate автоматически выдавал первичные ключи.Поместите эту аннотацию над полями Id и заново создайте базу данных.

@GeneratedValue(strategy = GenerationType.IDENTITY)

См .: https://thoughts -on-java.org / hibernate-tips-use-автоинкрементный-столбец первичный ключ /

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