java Hibernate正在外键字段中插入空值
我有两个简单的域对象,如下所示。。使用MYSQL数据库
@Entity
@Table(name="Product")
public class Product {
@Id
@Column(name="productId")
@GeneratedValue
protected int productId;
@Column(name="Product_Name")
protected String name;
@OneToMany(cascade = javax.persistence.CascadeType.ALL,mappedBy="product")
protected List<ProductOption> productoption = new ArrayList<ProductOption>();
第二个目标
@Entity
@Table(name="ProductOption")
public class ProductOption{
/**
*
*/
@Id
@Column(name="product_option_id")
@GeneratedValue
protected int productOptionId;
//@JoinColumn(name="productId")
@ManyToOne()
protected Product product;
@Column(name="ProductTopping")
private String topping;
还有我的主要方法
public class Createschema {
public static void main(String[] args) {
Product product = new Product();
product.setName("Coffee");
ProductOption po2 = new ProductOption();
po2.setTopping("barbeque");
ProductOption po = new ProductOption();
po.setTopping("whipcream");
ProductOption po1 = new ProductOption();
po1.setTopping("honeymustard");
List<ProductOption> productoptions = new ArrayList<ProductOption>();
productoptions.add(po1);
productoptions.add(po2);
productoptions.add(po);
System.out.println("schema!");
Configuration configuration = new Configuration().configure();
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
SessionFactory factory = configuration.buildSessionFactory(builder.build());
Session session = factory.openSession();
session.beginTransaction();
product.setProductoption(productoptions);
session.save(product);
session.getTransaction().commit();
session.close();
System.out.println(product.getName());
for(int i=0;i<product.getProductoption().size();i++){
System.out.println(product.getProductOptionsAsListOfStrings().get(i));
System.out.println(product.getProductoption().get(i).getTopping());
}
}
}
出于某种原因,hibernate正在productoptions的外键字段中插入空值。 我试着改变层叠式的风格和生成策略,但没有任何效果。使nullable=false将抛出错误。已插入数据,但productoptions表中的外键字段为空。 请帮忙
# 1 楼答案
我确实同意@Sindarth Ramesh。给出级联类型的想法。所有这些都是关于关系操作的插入、删除等可以由Hibernate自己处理的
您没有在ProductOption对象中设置product(product)
您不需要在main方法中创建新的List对象
您已经在中创建了列表对象
没有必要这样使用
您在main方法中创建了另一个ArrayList,它不必要地使用内存分配。当然,若您并没有在产品(实体)中创建新对象,那个么它需要像上面那个样做。但是现在,你可以这样存钱
这是我试图在main方法中修复的代码
不需要像上面的答案那样保存两个对象。它正在工作,但在@OneToMany中保存两个对象正在工作。但它会在@manytomy中起作用吗?我不这么认为。想想看。我们不想创建关联表。我们不会创建另一个名为Product\u ProductOptions或ProductOptions\u Product的实体。剩下的就让冬眠来做吧。这就是我们使用Hibernate的原因,不是吗
# 2 楼答案
在
Product
中更改在
ProductOption
变化中最后在{}