2013-10-01 118 views
1

我讀過很多教程關於彈簧休眠的關係,但我有點困惑如何在我的情況下使用它們......我的產品/類別實體定義如下:春天Hibernate的產品 - 類別關係

產品

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column 
private int id; 


@Column 
private int category; 
. 
. 
. 

類別

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column 
private int id; 

@NotEmpty 
@Column 
@Size (max = 25) 
private String name; 
. 
. 
. 

所以,我LIK E在產品列表頁面,根據語音「類別」將出現在類別名稱,並在產品形成的類別列表... 在我來說,一個產品只適合一類,所以如果我是正確的應該是@ManyToOne但我不知道如何實現這...在我的產品數據庫我已經CategoryID字段,但如果我標記類實體字段作爲@OneToMany它不會被存儲到數據庫...

編輯 我已經改變了像這樣(的建議): Product.class

@Table(name = "products") 
public class Product { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column 
    private int id; 

    @NotEmpty 
    @Column 
    @Size (max = 25) 
    private String name; 

    @Column 
    @Size (max = 255) 
    private String description; 


    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @JoinColumn(name = "category_id", nullable = false) 
    private Category category; 

Category.class

@Entity 
@Table(name = "categories") 
public class Category { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column 
    private int id; 

    @NotEmpty 
    @Column 
    @Size (max = 25) 
    private String name; 


    @Column 
    @Size (max = 255) 
    private String description; 


    //Here mappedBy indicates that the owner is in the other side 
    @OneToMany(fetch = FetchType.EAGER, mappedBy = "category", cascade = CascadeType.ALL) 
    private Set<Product> products = new HashSet<Product>(); 

控制器

@RequestMapping(value = "/add/", method = RequestMethod.POST) 
    public String addProduct(
      @ModelAttribute(value = "product") @Valid Product product, 
      BindingResult result, ModelMap model, Category category) { 




     if (result.hasErrors()) { 
      return "forms/productForm"; 
     } 

     try { 
      category.addProduct(product); 
      product.setCategory(category); 

      // Add product to db 
      productService.addProduct(product); 

     } catch (Exception e) { 
      log.error("/add/---" + e); 
      return "redirect:/product/deniedAction/?code=0"; 
     } 

     return "redirect:/admin/product/"; 

    } 

我還增加了產品的控制器上的@InitBinder從產品形態串類別將數據轉換......但現在,當我節省了產品它會自動保存一個類別,而不是附加當前選擇之一......

回答

0

所以你有這樣的:

Product{ 
    atributtes... 
    @ManyToOne 
    Category category; --so every product has a category 
    } 

    Category { 
    attributtes... 
    @OneToMany(cascade=CascadeType.ALL) 
    @JoinColumn(name="id_Product") 
    private List<Product> products; 
    } 

試試這個,如果不是我們可以看看另一種解決方案..

0

你似乎有類別和產品(一類具有許多產品)

在Java之間的一個一對多的關係(通常是OO),你會期望Category類包含一個Products列表,因此這個Category可以說是'擁有'的產品。

在SQL它是反過來 - 你所期望的產品表來保存的外鍵引用的範疇,所以在這裏,產品可以以自己的「類別可說的。

看起來像使用JPA你的,所以你可以有這樣的事情:

分類等級:

@Entity 
public class Category { 

    //other stuff... 

    @OneToMany(cascade=CascadeType.ALL, mappedBy="category") 
    private Set<Product> products; 

} 

產品類:

@Entity 
public class Product { 

    //other stuff... 

    @ManyToOne 
    private Category category; 
} 
+0

太好了!這是我需要的缺失部分!順便說一句,我有沒有從產品數據庫表中刪除類別ID?還有......我還要更改類別db一個嗎? –

+0

你不需要自己創建表格。 Hibernate可以爲你做這件事 - 當你運行它時,模式是由註釋(如果需要的話)生成的。除非您已經擁有需要保留的數據,否則我建議刪除所有表格,運行代碼,然後檢查新創建的表格和FK約束,以查看它們是否與預期一致。 – NickJ

+0

我覺得如果我聲明瞭auto.dll,hibernate會爲我做這件事 –

0

你說得對,你應該使用@ ManyToOne,因爲「...產品只適合一個類別......」。

在產品實體中聲明一個類別字段而不是int類別,並使用@ManyToOne對其進行註釋。還要添加@JoinColumn來指定數據庫中的product.category_id列的名稱。

產品

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column 
private int id; 


@ManyToOne 
@JoinColumn(name = "category_id") 
private Category category; 
. 
. 
. 
1

由於Product將只有一個類別,並Category都會有產品的列表,你可以通過在產品表創建一個Foreign Key指主要涉及這兩個鍵在類別表中:

Category Table: id, name, other fields... 
Product Table: id, category_id (FK), and other fields. 

並且映射可以被定義如下:

​​

mappedBy屬性告訴Hibernate集合是另一端多對一關聯的鏡像。它就像告訴Hibernate它應該將關聯的Product末尾所做的更改傳播到數據庫,而忽略僅對Category中的products集合所做的更改。因此,如果我們只撥打category.getProducts().add(product),則不會進行任何更改。由於該關聯是雙向的,因此您必須創建雙方的鏈接,而不僅僅是一個。

爲了您的方便,你可以在Category類添加一個addProduct方法來保存協會:

public void addProduct(Product product) { 
     product.setCategory(this); 
     products.add(product); 
} 
+0

感謝您的幫助,我實現了您的版本,並且它似乎正常工作......現在我有另一個問題:在產品表單中,我選擇帶有「選項」框......我如何將它保存在產品數據庫表category_id字段中? –

+0

如何在產品列表jsp頁面中顯示正確的類別名稱? –

+0

創建產品:'產品p =新產品()',設置產品的價值。然後創建類別:'Category c = new Category()',設置類別的值並將產品'p'添加到該類別中:'c.addProduct(p)'。然後將類'c'傳遞給'session.save(c)'方法。這會將產品'p'與類別'c'一起保存。 –

相關問題