有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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表中的外键字段为空。 请帮忙


共 (2) 个答案

  1. # 1 楼答案

    我确实同意@Sindarth Ramesh。给出级联类型的想法。所有这些都是关于关系操作的插入、删除等可以由Hibernate自己处理的

    您没有在ProductOption对象中设置product(product)

    您不需要在main方法中创建新的List对象

        List<ProductOption> productoptions = new ArrayList<ProductOption>();
    
        productoptions.add(po1);
        productoptions.add(po2);
        productoptions.add(po);
    

    您已经在中创建了列表对象

    @OneToMany(cascade = javax.persistence.CascadeType.ALL,mappedBy="product")
    protected List<ProductOption> productoption = new ArrayList<ProductOption>();
    

    没有必要这样使用

    product.setProductoption(productoptions);
    

    您在main方法中创建了另一个ArrayList,它不必要地使用内存分配。当然,若您并没有在产品(实体)中创建新对象,那个么它需要像上面那个样做。但是现在,你可以这样存钱

    //getProductionoption() is getter List type getter method in your Product Entity
    product.getProductionoption().add(po1);
    product.getProductionoption().add(po2);
    product.getProductionoption().add(po);
    

    这是我试图在main方法中修复的代码

        Product product = new Product(); //This must be created on top so that product(id) can be added in ProductOption(Object).
    
        //Product Options
        ProductOption po2 = new ProductOption();
        po2.setTopping("barbeque");
        po2.setProduct(product); //This will set your foreign key id
    
        ProductOption po = new ProductOption();
        po.setTopping("whipcream");
        po.setProduct(product); //This will set your foreign key id
    
        ProductOption po1 = new ProductOption();
        po1.setTopping("honeymustard");
        po1.setProduct(product); //This will set your foreign key id
    
        //product
        product.setName("Coffee");
        //getProductionoption() is getter List type getter method in your Product Entity
        product.getProductoption().add(po1); 
        product.getProductoption().add(po2);
        product.getProductoption().add(po);
        /*
        Or you can create list and use like this.
        But like I said, it is unnecessary.
        product.setProductoption(productoptions);
        */
    
        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); //Hibernate will automatically join the relationship here.
        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());
    

    不需要像上面的答案那样保存两个对象。它正在工作,但在@OneToMany中保存两个对象正在工作。但它会在@manytomy中起作用吗?我不这么认为。想想看。我们不想创建关联表。我们不会创建另一个名为Product\u ProductOptions或ProductOptions\u Product的实体。剩下的就让冬眠来做吧。这就是我们使用Hibernate的原因,不是吗

  2. # 2 楼答案

    Product中更改

    @OneToMany(mappedBy="product")
    List<ProductOption> productoption;
    

    ProductOption变化中

    @ManyToOne
    @JoinColumn(name="productId")
    private Product product;
    

    最后在{}

    session.beginTransaction();
    
    Product product = new Product();
    product.setName("Coffee");
    session.save(product);
    
    ProductOption po2 = new ProductOption();
    po2.setTopping("barbeque");
    po2.setProduct(product)
    ProductOption po = new ProductOption();
    po.setTopping("whipcream");
    po2.setProduct(product)
    ProductOption po1 = new ProductOption();
    po1.setTopping("honeymustard");
    po2.setProduct(product)
    
    session.save(po2);
    session.save(po);
    session.save(po1);
    
    session.getTransaction().commit();
    session.close();