java - Hibernate 在外键字段中插入空值

标签 java spring hibernate jpa persistence

我有 2 个简单的域对象,如下所示......使用 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 表中,外键字段为空。 请帮忙

最佳答案

Product 中更改

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

ProductOption 中更改

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

最后在 Createschema

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();

关于java - Hibernate 在外键字段中插入空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22002254/

相关文章:

mysql - 数据库的 Hibernate 加密对应用程序完全透明

java - 在 JBoss 4.2 上使用 JPA 启用 Hibernate 二级缓存

java - 使用txt文件在java控制台应用程序中创建登录页面

java - 将.java 文件添加到eclipse 中?

游戏循环和按钮的 Java 图形问题

Java 8 将 Map<K, List<V>> 转换为 Map<V, List<K>>

java - 获取 Spring 属性占位符及其解析值的列表

java - spring + GAE对spring容器的不正确初始化

java - Spring Boot变量/嵌套请求体

java - JPA 和一组枚举值