Java 无法插入ItemDetail的列表,即列表<;项目详情>;(对象)通过Hibernate使用SpringMVC导入MySQL数据库

Java 无法插入ItemDetail的列表,即列表<;项目详情>;(对象)通过Hibernate使用SpringMVC导入MySQL数据库,java,mysql,spring,hibernate,mysql-workbench,Java,Mysql,Spring,Hibernate,Mysql Workbench,我正在尝试创建一个名为“invoicedto”的表,其中有一个字段,由ItemDetail(POJO对象)的列表组成 我需要澄清以下几点: 1.我们可以在MySQL数据库的字段中插入对象列表吗? 如果可能的话怎么办?MYSQL中我的列的数据类型应该是什么? 2.如果我们无法插入列表?是否有其他方法实现此场景 如果您已在下面附上我的代码: 控制器: @Controller public class InvoiceController { @Autowired InvoiceService inv

我正在尝试创建一个名为“invoicedto”的表,其中有一个字段,由ItemDetail(POJO对象)的列表组成

我需要澄清以下几点: 1.我们可以在MySQL数据库的字段中插入对象列表吗? 如果可能的话怎么办?MYSQL中我的列的数据类型应该是什么? 2.如果我们无法插入列表?是否有其他方法实现此场景

如果您已在下面附上我的代码:

控制器

@Controller
public class InvoiceController {

@Autowired
InvoiceService invoiceService;

public void setInvoiceService(InvoiceService invoiceService) {
    this.invoiceService=invoiceService;
}


@RequestMapping("/invoice/add")
public ModelAndView addInvoice(){
    Map<String,Object> businessDataMap=new HashMap<>();
    ModelAndView modelAndView=new ModelAndView();
    String invoiceNumber = invoiceService.generateInvoiceNumber();
    businessDataMap.put("invoiceNumber", invoiceNumber);
    modelAndView.addAllObjects(businessDataMap);
    modelAndView.setViewName("add_invoice");
    return modelAndView;
}
}
package com.company.greeninvoice.service;

import java.sql.Date;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

import org.apache.commons.lang3.StringUtils;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.company.greeninvoice.dao.InvoiceDao;
import com.company.greeninvoice.dto.Customer;
import com.company.greeninvoice.dto.Invoice;
import com.company.greeninvoice.entity.ItemDetail;

@Service
public class InvoiceServiceImpl implements InvoiceService{

public static final String EMPTY_STRING = "";

public static final String INVOICE_CODE = "INV";

public static final String SEPERATOR = "-";

public static final String DEFAULT_INVOICE_NUMBER = "0000";

public static final String INVOICE_FORMATTER = "%04d";

@Autowired
InvoiceDao invoiceDao;

public void setInvoiceDao(InvoiceDao invoiceDao){
     this.invoiceDao = invoiceDao;
  }

@Transactional
@Override
public String generateInvoiceNumber() {
    insertRecord();
    String invoiceNumber = EMPTY_STRING;
    return invoiceNumber;
}

private void insertRecord() {
    Invoice invoice=new Invoice();
    LocalDate todayDate=LocalDate.now();
    String yearCode = String.valueOf(todayDate.getYear()%1000);
    String monthCode = LocalDate.now().getMonth().name().substring(0, 3);
    String invoiceNumber=INVOICE_CODE+SEPERATOR+yearCode+monthCode+SEPERATOR+"0001";
    invoice.setInvoiceNumber(invoiceNumber);
    Customer customer=new Customer();
    customer.setCustomerName("VENKAT");
    customer.setMale(true);
    invoice.setCustomerDetails(customer);
    invoice.setTotalAmount((float) 25.02);
    invoice.setInvoiceDate(Date.valueOf(todayDate));
    List<ItemDetail> itemdetailsList=new ArrayList<>();
    ItemDetail itemDetail=new ItemDetail();
    itemDetail.setSerialNumber("1");
    itemDetail.setItemDescription("Pencil");
    itemDetail.setItemQuantity(2);
    itemDetail.setItemRate(25);
    itemDetail.setAmount(50);
    itemdetailsList.add(itemDetail);
    invoice.setItemdetailsList( itemdetailsList);
    invoiceDao.addInvoice(invoice);
}
}
package com.company.greeninvoice.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.company.greeninvoice.dto.Invoice;

@Repository
public class InvoiceDaoImpl implements InvoiceDao{

private static final Logger logger = 
LoggerFactory.getLogger(InvoiceDaoImpl.class);

@Autowired
SessionFactory sessionFactory;

public void setSessionFactory(SessionFactory sessionFactory){
     this.sessionFactory = sessionFactory;
  }

@Override
public void addInvoice(Invoice invoice) {
    Session session = this.sessionFactory.getCurrentSession();
    session.persist(invoice);
    logger.info("Invoice saved successfully, Invoice Details="+invoice);
}

}
package com.company.greeninvoice.entity;

import java.io.Serializable;

import javax.persistence.Embeddable;
import javax.persistence.Entity;
import javax.persistence.Id;
import lombok.Data;

@Data
@Entity
public class ItemDetail  implements Serializable{
@Id
 private String serialNumber;

 private String itemDescription;

 private int itemQuantity;

 private float itemRate;

 private float amount;

 }
型号

@Controller
public class InvoiceController {

@Autowired
InvoiceService invoiceService;

public void setInvoiceService(InvoiceService invoiceService) {
    this.invoiceService=invoiceService;
}


@RequestMapping("/invoice/add")
public ModelAndView addInvoice(){
    Map<String,Object> businessDataMap=new HashMap<>();
    ModelAndView modelAndView=new ModelAndView();
    String invoiceNumber = invoiceService.generateInvoiceNumber();
    businessDataMap.put("invoiceNumber", invoiceNumber);
    modelAndView.addAllObjects(businessDataMap);
    modelAndView.setViewName("add_invoice");
    return modelAndView;
}
}
package com.company.greeninvoice.service;

import java.sql.Date;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

import org.apache.commons.lang3.StringUtils;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.company.greeninvoice.dao.InvoiceDao;
import com.company.greeninvoice.dto.Customer;
import com.company.greeninvoice.dto.Invoice;
import com.company.greeninvoice.entity.ItemDetail;

@Service
public class InvoiceServiceImpl implements InvoiceService{

public static final String EMPTY_STRING = "";

public static final String INVOICE_CODE = "INV";

public static final String SEPERATOR = "-";

public static final String DEFAULT_INVOICE_NUMBER = "0000";

public static final String INVOICE_FORMATTER = "%04d";

@Autowired
InvoiceDao invoiceDao;

public void setInvoiceDao(InvoiceDao invoiceDao){
     this.invoiceDao = invoiceDao;
  }

@Transactional
@Override
public String generateInvoiceNumber() {
    insertRecord();
    String invoiceNumber = EMPTY_STRING;
    return invoiceNumber;
}

private void insertRecord() {
    Invoice invoice=new Invoice();
    LocalDate todayDate=LocalDate.now();
    String yearCode = String.valueOf(todayDate.getYear()%1000);
    String monthCode = LocalDate.now().getMonth().name().substring(0, 3);
    String invoiceNumber=INVOICE_CODE+SEPERATOR+yearCode+monthCode+SEPERATOR+"0001";
    invoice.setInvoiceNumber(invoiceNumber);
    Customer customer=new Customer();
    customer.setCustomerName("VENKAT");
    customer.setMale(true);
    invoice.setCustomerDetails(customer);
    invoice.setTotalAmount((float) 25.02);
    invoice.setInvoiceDate(Date.valueOf(todayDate));
    List<ItemDetail> itemdetailsList=new ArrayList<>();
    ItemDetail itemDetail=new ItemDetail();
    itemDetail.setSerialNumber("1");
    itemDetail.setItemDescription("Pencil");
    itemDetail.setItemQuantity(2);
    itemDetail.setItemRate(25);
    itemDetail.setAmount(50);
    itemdetailsList.add(itemDetail);
    invoice.setItemdetailsList( itemdetailsList);
    invoiceDao.addInvoice(invoice);
}
}
package com.company.greeninvoice.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.company.greeninvoice.dto.Invoice;

@Repository
public class InvoiceDaoImpl implements InvoiceDao{

private static final Logger logger = 
LoggerFactory.getLogger(InvoiceDaoImpl.class);

@Autowired
SessionFactory sessionFactory;

public void setSessionFactory(SessionFactory sessionFactory){
     this.sessionFactory = sessionFactory;
  }

@Override
public void addInvoice(Invoice invoice) {
    Session session = this.sessionFactory.getCurrentSession();
    session.persist(invoice);
    logger.info("Invoice saved successfully, Invoice Details="+invoice);
}

}
package com.company.greeninvoice.entity;

import java.io.Serializable;

import javax.persistence.Embeddable;
import javax.persistence.Entity;
import javax.persistence.Id;
import lombok.Data;

@Data
@Entity
public class ItemDetail  implements Serializable{
@Id
 private String serialNumber;

 private String itemDescription;

 private int itemQuantity;

 private float itemRate;

 private float amount;

 }
1.InvoiceModel:[我应该使用,ElementCollection注释吗?]

问题列表未插入

package com.company.greeninvoice.dto;

import java.io.Serializable;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CollectionTable;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.annotations.CollectionId;

import com.company.greeninvoice.entity.ItemDetail;

import lombok.Data;
import lombok.Setter;

@Data
@Entity
@Setter
@Table(name="invoiceDto")
public class Invoice implements Serializable{

@Id
private String invoiceNumber;

private Date invoiceDate;

private Customer customerDetails;

@ElementCollection
private List<ItemDetail> itemdetailsList;

private float totalAmount;
}
Eclipse中的Tomcat控制台:

@Controller
public class InvoiceController {

@Autowired
InvoiceService invoiceService;

public void setInvoiceService(InvoiceService invoiceService) {
    this.invoiceService=invoiceService;
}


@RequestMapping("/invoice/add")
public ModelAndView addInvoice(){
    Map<String,Object> businessDataMap=new HashMap<>();
    ModelAndView modelAndView=new ModelAndView();
    String invoiceNumber = invoiceService.generateInvoiceNumber();
    businessDataMap.put("invoiceNumber", invoiceNumber);
    modelAndView.addAllObjects(businessDataMap);
    modelAndView.setViewName("add_invoice");
    return modelAndView;
}
}
package com.company.greeninvoice.service;

import java.sql.Date;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

import org.apache.commons.lang3.StringUtils;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.company.greeninvoice.dao.InvoiceDao;
import com.company.greeninvoice.dto.Customer;
import com.company.greeninvoice.dto.Invoice;
import com.company.greeninvoice.entity.ItemDetail;

@Service
public class InvoiceServiceImpl implements InvoiceService{

public static final String EMPTY_STRING = "";

public static final String INVOICE_CODE = "INV";

public static final String SEPERATOR = "-";

public static final String DEFAULT_INVOICE_NUMBER = "0000";

public static final String INVOICE_FORMATTER = "%04d";

@Autowired
InvoiceDao invoiceDao;

public void setInvoiceDao(InvoiceDao invoiceDao){
     this.invoiceDao = invoiceDao;
  }

@Transactional
@Override
public String generateInvoiceNumber() {
    insertRecord();
    String invoiceNumber = EMPTY_STRING;
    return invoiceNumber;
}

private void insertRecord() {
    Invoice invoice=new Invoice();
    LocalDate todayDate=LocalDate.now();
    String yearCode = String.valueOf(todayDate.getYear()%1000);
    String monthCode = LocalDate.now().getMonth().name().substring(0, 3);
    String invoiceNumber=INVOICE_CODE+SEPERATOR+yearCode+monthCode+SEPERATOR+"0001";
    invoice.setInvoiceNumber(invoiceNumber);
    Customer customer=new Customer();
    customer.setCustomerName("VENKAT");
    customer.setMale(true);
    invoice.setCustomerDetails(customer);
    invoice.setTotalAmount((float) 25.02);
    invoice.setInvoiceDate(Date.valueOf(todayDate));
    List<ItemDetail> itemdetailsList=new ArrayList<>();
    ItemDetail itemDetail=new ItemDetail();
    itemDetail.setSerialNumber("1");
    itemDetail.setItemDescription("Pencil");
    itemDetail.setItemQuantity(2);
    itemDetail.setItemRate(25);
    itemDetail.setAmount(50);
    itemdetailsList.add(itemDetail);
    invoice.setItemdetailsList( itemdetailsList);
    invoiceDao.addInvoice(invoice);
}
}
package com.company.greeninvoice.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.company.greeninvoice.dto.Invoice;

@Repository
public class InvoiceDaoImpl implements InvoiceDao{

private static final Logger logger = 
LoggerFactory.getLogger(InvoiceDaoImpl.class);

@Autowired
SessionFactory sessionFactory;

public void setSessionFactory(SessionFactory sessionFactory){
     this.sessionFactory = sessionFactory;
  }

@Override
public void addInvoice(Invoice invoice) {
    Session session = this.sessionFactory.getCurrentSession();
    session.persist(invoice);
    logger.info("Invoice saved successfully, Invoice Details="+invoice);
}

}
package com.company.greeninvoice.entity;

import java.io.Serializable;

import javax.persistence.Embeddable;
import javax.persistence.Entity;
import javax.persistence.Id;
import lombok.Data;

@Data
@Entity
public class ItemDetail  implements Serializable{
@Id
 private String serialNumber;

 private String itemDescription;

 private int itemQuantity;

 private float itemRate;

 private float amount;

 }
Hibernate:插入到invoiceDto(customerDetails,invoiceDate,totalAmount,invoiceNumber)值(?,,?)
休眠:将值(?,)插入到发票\u itemdetailsList(发票\u invoiceNumber,itemdetailsList)中
2018年1月21日下午5:50:40 org.apache.catalina.core.StandardWrapper
严重:路径为[/greeninvoice]的上下文中Servlet[dispatcher]的Servlet.service()引发异常[请求处理失败;嵌套异常为org.springframework.dao.InvalidDataAccessResourceUsageException:无法执行语句;SQL[n/a];嵌套异常为org.hibernate.exception.sqlgrammareException:无法执行语句]根本原因
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:字段列表中的未知列“itemdetailsList”
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(未知源)
位于sun.reflect.delegatingConstructor或AccessorImpl.newInstance(未知源)
位于java.lang.reflect.Constructor.newInstance(未知源)
位于com.mysql.jdbc.Util.HandleneInstance(Util.java:404)
位于com.mysql.jdbc.Util.getInstance(Util.java:387)
位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:939)
在com.mysql.jdbc.MysqlIO.checkErrorPacket上(MysqlIO.java:3878)
在com.mysql.jdbc.MysqlIO.checkErrorPacket上(MysqlIO.java:3814)
位于com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2478)
位于com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2625)
位于com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2551)
位于com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1861)
位于com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2073)
位于com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2009)
位于com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5094)
在com.mysql.jdbc.PreparedStatement.executeUpdate上(PreparedStatement.java:1994)
位于org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
位于org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
位于org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:187)
位于org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:62)
位于org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1311)
位于org.hibernate.action.internal.CollectionRecreateAction.execute(CollectionRecreateAction.java:67)
位于org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:463)
位于org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:349)
位于org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350)
位于org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56)
位于org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1222)
位于org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:425)
位于org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
位于org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:177)
位于org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:555)
位于org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:757)
位于org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:726)
位于org.springframework.transaction.interceptor.TransactionSpectSupport.commitTransactionAfterReturning(TransactionSpectSupport.java:478)
位于org.springframework.transaction.interceptor.TransactionSpectSupport.invokeWithinTransaction(TransactionSpectSupport.java:272)
位于org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:179)上
位于org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
位于com.sun.proxy.$Proxy26.generateInvoiceNumber(未知来源)
在com.company.greeninvoice.controller.InvoiceController.addInvoice(InvoiceController.java:35)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(未知源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke处(未知源)
位于java.lang.reflect.Method.invoke(未知源)
位于org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
位于org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
位于org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
在org.springframework上。