2014-02-25 38 views
0

我有2個簡單的域對象,如下所示..使用MYSQL DB。Hibernate在外鍵字段中插入空值

@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表中foriegn鍵字段爲空。 請幫助

回答

3

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

謝謝! ..我做了一個非常愚蠢的錯誤..我忘了每個選項.setProduct。我認爲hibernate會在內部做到這一點。 – Nikhil