Я пытаюсь соединить пиццу и ингредиенты в соотношении 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 и что он не установлен должным образом.