4

春と休止状態の関係に関する多くのチュートリアルを読みましたが、私の場合にそれらを使用する方法について少し混乱しています...次のように定義された製品/カテゴリエンティティがあります:

製品

@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;
.
.
.

だから、私は製品リストページで、「カテゴリ」という声の下にカテゴリ名が表示され、製品フォームにカテゴリリストが表示されます...私の場合、製品は1つのカテゴリにしか適合しないので、私が正しい場合@ManyToOne である必要がありますが、これを実装する方法がわかりません... 製品データベースに categoryId フィールドがありますが、カテゴリ エンティティ フィールドを @OneToMany としてマークすると、db に保存されません。 ..

編集 私はこのように変更しました(提案されているように): 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;

カテゴリ.クラス

@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 も追加しました...しかし、製品を保存すると、既存の選択されたカテゴリを添付する代わりに、カテゴリが自動的に保存されます...

4

4 に答える 4

0

そうです、@ManyToOne を使用する必要があります。「...製品は 1 つのカテゴリにしか適合しない...」ためです。

Product エンティティで、int カテゴリの代わりにカテゴリ フィールドを宣言し、@ManyToOne で注釈を付けます。また、@JoinColumn を追加して、データベースの product.category_id 列の名前を指定します。

製品:

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


@ManyToOne
@JoinColumn(name = "category_id")
private Category category;
.
.
.
于 2013-10-01T09:57:22.917 に答える