我认为真正的问题是我无法获得最近持续存在的实体的 id(我不知道如何)。我正在使用 eclipseLink 2.1 和 mysql 5.1.7 所以我离开了我的实体类
多对多的连接表,是ProductosVentas;对不起西班牙语命名
请帮我
这是我的脚本
public static void main(String args[]) {
EntityManager em = EclipseLinkUtil.getEntityManagerFactory();
em.getTransaction().begin();
try {
Query query = em
.createQuery("from Productos p where p.nombre like 'Lavado de motor' ");
Productos selledItem = (Productos) query.getSingleResult();
query = em.createNativeQuery("select curdate() ");
java.sql.Date sellingDate = (Date) query.getSingleResult();
Ventas v1 = new Ventas();
v1.setCondicionventaIdcondicionventa(new Condicionventa(1));
v1.setFecha(sellingDate);
List<Productosventas> selledItemTableList = new ArrayList<>();
v1.setProductosventasCollection(selledItemTableList);
Productosventas p = new Productosventas();
p.setVentas(v1);
p.setCantidad(1);
p.setProductos(selledItem);
selledItemTableList.add(p);
em.persist(v1);
em.persist(p);
em.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
em.getTransaction().rollback();
} finally {
em.close();
}
}
错误
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:
列'ventas_idventa'不能为空错误代码:1048调用:插入productosventas(cantidad,ventas_idventa,productos_idProductos,PriceModifiers_idPriceModifier)值(?,?,?,?)绑定=> [4个参数绑定]
这些是我的实体
@Entity
@Table(name = "productos")
@XmlRootElement
public class Productos implements Serializable {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "productos")
private Collection<Productosventas> productosventasCollection;
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "idProductos")
private Integer idProductos;
// [properties]
@JoinColumn(name = "PriceModifiers_idPriceModifier",
referencedColumnName = "idPriceModifier")
@ManyToOne(optional = false)
private Pricemodifiers priceModifiersidPriceModifier;
@JoinColumn(name = "AreaServicio_idAreaServicio",
referencedColumnName = "idAreaServicio")
@ManyToOne(optional = false)
private Areaservicio areaServicioidAreaServicio;
@JoinColumn(name = "formaventa_idFormaVenta",
referencedColumnName = "idFormaVenta")
@ManyToOne(optional = false)
private Formaventa formaventaidFormaVenta;
// geters and setters
@XmlTransient
public Collection<Productosventas> getProductosventasCollection() {
return productosventasCollection;
}
public void setProductosventasCollection(
Collection<Productosventas> productosventasCollection) {
this.productosventasCollection = productosventasCollection;
}
}
@Entity
@Table(name = "ventas")
@XmlRootElement
public class Ventas implements Serializable {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "ventas")
private Collection<Productosventas> productosventasCollection;
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "idventa")
private Integer idventa;
@Column(name = "fecha")
@Temporal(TemporalType.TIMESTAMP)
private Date fecha;
@JoinColumn(name = "condicionventa_idcondicionventa",
referencedColumnName = "idcondicionventa")
@ManyToOne(optional = false)
private Condicionventa condicionventaIdcondicionventa;
@JoinColumn(name = "climas_idclimas", referencedColumnName = "idclimas")
@ManyToOne(optional = false)
private Climas climasIdclimas;
@JoinColumn(name = "cliente_idcliente", referencedColumnName = "idcliente")
@ManyToOne(optional = false)
private Cliente clienteIdcliente;
@JoinColumn(name = "cars_numberplate", referencedColumnName = "numberplate")
@ManyToOne(optional = false)
private Cars carsNumberplate;
// getters and setters
@XmlTransient
public Collection<Productosventas> getProductosventasCollection() {
return productosventasCollection;
}
public void setProductosventasCollection(
Collection<Productosventas> productosventasCollection) {
this.productosventasCollection = productosventasCollection;
}
}
@Entity
@Table(name = "productosventas")
@XmlRootElement
public class Productosventas implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
protected ProductosventasPK productosventasPK;
@Column(name = "cantidad")
private Integer cantidad;
@JoinColumn(name = "PriceModifiers_idPriceModifier",
referencedColumnName = "idPriceModifier")
@ManyToOne(optional = false)
private Pricemodifiers priceModifiersidPriceModifier;
@JoinColumn(name = "ventas_idventa", referencedColumnName = "idventa",
insertable = false, updatable = false)
@ManyToOne(optional = false)
private Ventas ventas;
@JoinColumn(name = "productos_idProductos",
referencedColumnName = "idProductos", insertable = false,
updatable = false)
@ManyToOne(optional = false)
private Productos productos;
public Productosventas() {}
public Productosventas(ProductosventasPK productosventasPK) {
this.productosventasPK = productosventasPK;
}
public Productosventas(int ventasIdventa, int productosidProductos) {
this.productosventasPK = new ProductosventasPK(ventasIdventa,
productosidProductos);
}
public ProductosventasPK getProductosventasPK() {
return productosventasPK;
}
public void setProductosventasPK(ProductosventasPK productosventasPK) {
this.productosventasPK = productosventasPK;
}
// geters and setters
}
@Embeddable
public class ProductosventasPK implements Serializable {
@Basic(optional = false)
@Column(name = "ventas_idventa")
private int ventasIdventa;
@Basic(optional = false)
@Column(name = "productos_idProductos")
private int productosidProductos;
public ProductosventasPK() {}
public ProductosventasPK(int ventasIdventa, int productosidProductos) {
this.ventasIdventa = ventasIdventa;
this.productosidProductos = productosidProductos;
}
// geters and setters
@Override
public int hashCode() {
int hash = 0;
hash += (int) ventasIdventa;
hash += (int) productosidProductos;
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are
// not set
if (!(object instanceof ProductosventasPK)) {
return false;
}
ProductosventasPK other = (ProductosventasPK) object;
if (this.ventasIdventa != other.ventasIdventa) {
return false;
}
if (this.productosidProductos != other.productosidProductos) {
return false;
}
return true;
}
@Override
public String toString() {
return "tiendita.entities.ProductosventasPK[ ventasIdventa="
+ ventasIdventa + ", productosidProductos=" + productosidProductos
+ " ]";
}
}
编辑
我试图先冲洗(感谢克里斯),但它看起来丑陋、冗长且不合时宜……这似乎是一种奇特的方式,但它是用休眠方式编写的,太糟糕了,我正在使用 eclipselink。我希望这段代码可以用同样的方式编写。
session.beginTransaction();
Stock stock = new Stock();
stock.setStockCode("7052");
stock.setStockName("PADINI");
Category category1 = new Category("CONSUMER", "CONSUMER COMPANY");
//new category, need save to get the id first
session.save(category1);
StockCategory stockCategory = new StockCategory();
stockCategory.setStock(stock);
stockCategory.setCategory(category1);
stockCategory.setCreatedDate(new Date()); //extra column
stockCategory.setCreatedBy("system"); //extra column
stock.getStockCategories().add(stockCategory);
session.save(stock);
session.getTransaction().commit();
这似乎很简陋
EntityManager em = EclipseLinkUtil.getEntityManagerFactory();
em.getTransaction().begin();
try {
Query query = em.createQuery("from Productos p where p.nombre like 'Lavado de motor' ");
Productos selledItem = (Productos) query.getSingleResult();
query = em.createNativeQuery("select curdate() ");
java.sql.Date sellingDate = (Date) query.getSingleResult();
Ventas v1 = new Ventas();
v1.setCondicionventaIdcondicionventa(new Condicionventa(1));
v1.setFecha(sellingDate);
List<Productosventas> selledItemTableList = new ArrayList<>();
v1.setProductosventasCollection(selledItemTableList);
em.persist(v1);
em.flush();
Productosventas p = new Productosventas();
p.setProductosventasPK(new ProductosventasPK(v1.getIdventa(), selledItem.getIdProductos()));
p.setCantidad(1);
p.setProductos(selledItem);
selledItemTableList.add(p);
p = new Productosventas();
p.setProductosventasPK(new ProductosventasPK(v1.getIdventa(), selledItem.getIdProductos()));
p.setCantidad(2);
selledItemTableList.add(p);
selledItem.setProductosventasCollection(selledItemTableList);
em.persist(selledItem);
em.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
em.getTransaction().rollback();
} finally {
em.close();
}
我最讨厌的是这个
em.persist(v1);
em.flush();
Productosventas p = new Productosventas();
p.setProductosventasPK(new ProductosventasPK(v1.getIdventa(), selledItem.getIdProductos()));
p.setCantidad(1);
p.setProductos(selledItem);
第二次编辑
public class ProductosventasPK implements Serializable {
private int ventas;
private int productos;
public ProductosventasPK() {
}
public ProductosventasPK(int ventasIdventa, int productosidProductos) {
this.ventas = ventasIdventa;
this.productos = productosidProductos;
}
// geters and setters
@Override
public String toString() {
return "tiendita.entities.ProductosventasPK[ ventasIdventa=" + ventas
+ ", productosidProductos=" + productos + " ]";
}
}
@Entity
@IdClass(ProductosventasPK.class)
@Table(name = "productosventas", catalog = "tiendita", schema = "")
public class Productosventas implements Serializable {
@JoinColumn(name = "productos_idProductos", referencedColumnName = "idProductos",
insertable = true, updatable = true)
@Id
@ManyToOne(optional = false, cascade = CascadeType.MERGE)
private Productos productos;
@JoinColumn(name = "ventas_idventa", referencedColumnName = "idventa",
insertable = true, updatable = true)
@Id
@ManyToOne(optional = false)
private Ventas ventas;
ProductosventasPK productosventasPK;
//important parts
}
其余部分完全相同
最终编辑
[EL 警告]:2013-09-25 17:14:14.291--ServerSession(1770214826)--异常 [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions .DatabaseException 内部异常:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:“字段列表”中的未知列“PRODUCTOSVENTASPK”错误代码:1054 调用:SELECT cantidad、PRODUCTOSVENTASPK、PriceModifiers_idPriceModifier、productos_idProductos、ventas_idventa FROM tiendita.productosventas WHERE (productos_idProductos = ?) bind => [1 参数绑定] 查询:ReadAllQuery(name="productosventasList" referenceClass=Productosventas sql="SELECT cantidad, PRODUCTOSVENTASPK, PriceModifiers_idPriceModifier, productos_idProductos, ventas_idventa FROM tiendita。productosventas WHERE (productos_idProductos = ?)") 构建成功(总时间:3 秒)
public class Productosventas implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name = "cantidad")
private Integer cantidad;
@JoinColumn(name = "PriceModifiers_idPriceModifier", referencedColumnName = "idPriceModifier")
@ManyToOne
private Pricemodifiers priceModifiersidPriceModifier;
@JoinColumn(name = "productos_idProductos", referencedColumnName = "idProductos", insertable = true, updatable = true)
@Id
@ManyToOne(optional = false, cascade = CascadeType.MERGE)
private Productos productos;
@JoinColumn(name = "ventas_idventa", referencedColumnName = "idventa", insertable = true, updatable = true)
@Id
@ManyToOne(optional = false)
private Ventas ventas;
@Transient//transistent worked like a charm
ProductosventasPK productosventasPK;
...rest of the class }
现在我随心所欲地插入
public static void prueba2() {
EntityManager em = EclipseLinkUtil.getEntityManagerFactory();
em.getTransaction().begin();
try {
Query query = em.createQuery("from Productos p where p.nombre like 'Lavado de motor' ");
Productos selledItem = (Productos) query.getSingleResult();
query = em.createQuery("from Productos p where p.nombre like 'Lavado de ventana' ");
Productos selledItem2 = (Productos) query.getSingleResult();
// query = em.createNativeQuery("select curdate() ");
//java.sql.Date sellingDate = (Date) query.getSingleResult();
java.util.Date sellingDate = new java.util.Date();
Ventas v1 = new Ventas();
v1.setCondicionventaIdcondicionventa(new Condicionventa(1));
v1.setFecha(sellingDate);
List<Productosventas> selledItemTableList = new ArrayList<>();
Productosventas pdv = new Productosventas();
Productosventas pdv2 = new Productosventas();
em.persist(v1);
pdv.setCantidad(2);
pdv.setProductos(selledItem);
pdv.setVentas(v1);
pdv2.setCantidad(2);
pdv2.setProductos(selledItem2);
pdv2.setVentas(v1);
selledItem.getProductosventasList().add(pdv);
selledItem.getProductosventasList().add(pdv2);
v1.setProductosventasList(selledItemTableList);
em.getTransaction().commit();
} catch (Exception e) {
em.getTransaction().rollback();
} finally {
em.close();
}
}