Spring jpa具有额外列的多对多:列id不能为null
我试图保存一个具有多对多关系的实体,但收到一个错误 项目:Spring jpa具有额外列的多对多:列id不能为null,spring,jpa,Spring,Jpa,我试图保存一个具有多对多关系的实体,但收到一个错误 项目: import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.pe
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
@Entity
public class Item {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id ;
private String name ;
private String brand ;
private String category ;
private Double unitPrice ;
private Double weight ;
private String manufacturer ;
private String description ;
@OneToMany(mappedBy = "item", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<ItemInventory> itemInventories;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public Double getUnitPrice() {
return unitPrice;
}
public void setUnitPrice(Double unitPrice) {
this.unitPrice = unitPrice;
}
public Double getWeight() {
return weight;
}
public void setWeight(Double weight) {
this.weight = weight;
}
public String getManufacturer() {
return manufacturer;
}
public void setManufacturer(String manufacturer) {
this.manufacturer = manufacturer;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Item() {
super();
// TODO Auto-generated constructor stub
}
public Set<ItemInventory> getItemInventories() {
return itemInventories;
}
public void setItemInventories(Set<ItemInventory> itemInventories) {
this.itemInventories = itemInventories;
}
public Item(Integer id, String name, String brand, String category, Double unitPrice, Double weight,
String manufacturer, String description, Set<ItemInventory> itemInventories) {
super();
this.id = id;
this.name = name;
this.brand = brand;
this.category = category;
this.unitPrice = unitPrice;
this.weight = weight;
this.manufacturer = manufacturer;
this.description = description;
this.itemInventories = itemInventories;
}
@Override
public String toString() {
return "Item [id=" + id + "]";
}
}
堆栈跟踪:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:
列“item_id”在处不能为空
sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
~(na:1.8.0_112)at
sun.reflect.NativeConstructorAccessorImpl.newInstance(未知源)
~(na:1.8.0_112)at
sun.reflect.delegatingConstructor AccessorImpl.newInstance(未知
源)~[na:1.8.0_112]at
java.lang.reflect.Constructor.newInstance(未知源)
~(na:1.8.0_112)at
com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
~[mysql-connector-java-5.1.43.jar:5.1.43]at
com.mysql.jdbc.Util.getInstance(Util.java:408)
~[mysql-connector-java-5.1.43.jar:5.1.43]at
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:935)
~[mysql-connector-java-5.1.43.jar:5.1.43]at
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973)
~[mysql-connector-java-5.1.43.jar:5.1.43]at
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)
~[mysql-connector-java-5.1.43.jar:5.1.43]at
com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)
~[mysql-connector-java-5.1.43.jar:5.1.43]at
com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)
~[mysql-connector-java-5.1.43.jar:5.1.43]at
com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2494)
~[mysql-connector-java-5.1.43.jar:5.1.43]at
com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858)
~[mysql-connector-java-5.1.43.jar:5.1.43]at
com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2079)
~[mysql-connector-java-5.1.43.jar:5.1.43]at
com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2013)
~[mysql-connector-java-5.1.43.jar:5.1.43]at
com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5104)
~[mysql-connector-java-5.1.43.jar:5.1.43]at
com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1998)
~[mysql-connector-java-5.1.43.jar:5.1.43]at
sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
~(na:1.8.0_112)at
sun.reflect.NativeMethodAccessorImpl.invoke(未知源)
~(na:1.8.0_112)at
sun.reflect.DelegatingMethodAccessorImpl.invoke(未知源)
~[na:1.8.0_112]位于java.lang.reflect.Method.invoke(未知源代码)
~(na:1.8.0_112)at
org.apache.tomcat.jdbc.pool.StatementFacade$StatementProxy.invoke(StatementFacade.java:114)
~[tomcat-jdbc-8.5.16.jar:na]at
com.sun.proxy.$Proxy104.executeUpdate(未知源)~[na:na]位于
org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:204)
~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]at
org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:45)
~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]at
org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2949)
~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]at
org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3449)
~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]at
org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:89)
~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]at
org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:582)
~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]at
org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:456)
~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]at
org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:337)
~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]at
org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]at
org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1282)
~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]at
org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:465)
~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]at
TransactionCompletion之前的org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:2963)
~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]at
org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2339)
~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]at
org.hibernate.engine.jdbc.internal.jdbcoordinatorimpl.beforeTransactionCompletion(jdbcoordinatorimpl.java:485)
~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]at
org.hibernate.resource.transaction.backend.jdbc.internal.jdbResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(jdbResourceLocalTransactionCoordinatorImpl.java:147)
~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]at
org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$100(JdbcResourceLocalTransactionCoordinatorImpl.java:38)
~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]at
org.hibernate.resource.transaction.backend.jdbc.internal.jdbResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(jdbResourceLocalTransactionCoordinatorImpl.java:231)
~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]at
org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:65)
~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]at
org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:61)
~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]at
org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517)
~[spring-orm-4.3.10.RELEASE.jar:4.3.10.RELEASE]位于
org.springframew
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
@Entity
public class Inventory {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String address ;
private String phone ;
@Override
public String toString() {
return "Inventory [id=" + id + "]";
}
private String gps_coordinates ;
@ManyToOne
@JoinColumn(name = "company_id")
private Company company ;
@OneToMany(mappedBy = "inventory", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<ItemInventory> itemInventories;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getGps_coordinates() {
return gps_coordinates;
}
public void setGps_coordinates(String gps_coordinates) {
this.gps_coordinates = gps_coordinates;
}
public Set<ItemInventory> getItemInventories() {
return itemInventories;
}
public void setItemInventories(Set<ItemInventory> itemInventories) {
this.itemInventories = itemInventories;
}
public Company getCompany() {
return company;
}
public void setCompany(Company company) {
this.company = company;
}
public Inventory(Integer id, String address, String phone, String gps_coordinates, Company company,
Set<ItemInventory> itemInventories) {
super();
this.id = id;
this.address = address;
this.phone = phone;
this.gps_coordinates = gps_coordinates;
this.company = company;
this.itemInventories = itemInventories;
}
public Inventory() {
super();
// TODO Auto-generated constructor stub
}
}
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.hibernate.annotations.NotFound;
import org.hibernate.annotations.NotFoundAction;
@Entity
@Table(name = "item_inventory")
public class ItemInventory implements Serializable {
@Id
@ManyToOne
@JoinColumn(name = "item_id")
private Item item ;
@Id
@ManyToOne
@JoinColumn(name = "inventory_id")
private Inventory inventory ;
private Long quantity ;
public Item getItem() {
return item;
}
public void setItem(Item item) {
this.item = item;
}
public Inventory getInventory() {
return inventory;
}
public void setInventory(Inventory inventory) {
this.inventory = inventory;
}
@Column(name = "quantity")
public Long getQuantity() {
return quantity;
}
public void setQuantity(Long quantity) {
this.quantity = quantity;
}
public ItemInventory(Item item, Inventory inventory, Long quantity) {
super();
this.item = item;
this.inventory = inventory;
this.quantity = quantity;
}
public ItemInventory() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "ItemInventory [item=" + item + ", inventory=" + inventory + ", quantity=" + quantity + "]";
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.inconso.models.Inventory;
import com.inconso.models.Item;
import com.inconso.models.ItemInventory;
import com.inconso.repositories.InventoryRepository;
import com.inconso.repositories.ItemRepository;
@RestController
public class ItemController {
@Autowired
private ItemRepository itemRepos ;
@Autowired
private InventoryRepository inventoryRepos ;
@RequestMapping(value = "itemInventory/add/{company}", method = RequestMethod.POST)
public Object addItem(@RequestBody ItemInventory itemInventory) {
Item item = itemRepos.findOne(itemInventory.getItem().getId()) ;
// still add stuff here in case item not found
Inventory inventory = inventoryRepos.findOne(itemInventory.getInventory().getId()) ;
// still add stuff here if inventory not found
itemInventory.setInventory(inventory);
itemInventory.setItem(item);
item.getItemInventories().add(itemInventory) ;
inventory.getItemInventories().add(itemInventory) ;
System.out.println("-------"+itemInventory.getItem()+"---------");
itemRepos.save(item) ;
return "Item added" ;
}
}
item.getItemInventories().add(itemInventory) ;