JPA加入专栏

时间:2015-07-30 07:30:33

标签: java jquery mysql database jpa

我在数据库中有3个表。

第一个(类别)包括:id,category,isactive

第二个(菜单)包括:parentid和childid。

第三项(项目)包括:身份证,姓名和价格。

第一张表与第二张表有关系。我现在想做第二和第三之间的关系。

第二个表在数据库中包含以下值:

  • 7(id),book1(name),120(price)
  • 7(id),book2(name),100(price)
  • 8(id),car1(姓名),1620(价格)
  • 8(id),car2(姓名),520(价格)
  • 8(id),car3(姓名),5520(价格)
  • 9(id),house1(姓名),10000(价格)
  • 9(id),house2(姓名),11000(价格)
  • 9(id),house3(姓名),15000(价格)

目前我已将列childid加入列id。

Menu.java

@EmbeddedId MenuId id;

@Column(name="PARENTID")
private Integer parentid;

@Column(name="CHILDID")
private Integer childid;

@OneToOne
@JoinColumn(name="CHILDID",referencedColumnName="ID")

private Categories subcategories;

public Categories getSubcategories() {
    return this.subcategories;
}

public void setSubategories(Categories subcategories) {
    this.subcategories = subcategories;     
}

@OneToOne
@JoinColumn(name="PARENTID", referencedColumnName="ID")
private Categories categories;

public Categories getCategories() {
    return this.categories;
}

public void setCategories(Categories categories) {
    this.categories = categories;
}

@OneToOne
@JoinColumn(name="CHILDID",referencedColumnName="ID")
private Items items;
public Items getItems() {
    return this.items;
}

public void setItems(Items items) {
    this.items = items;
}

Items.java也没有修改为subcategories.java

我正在使用json对象打印出我的值:

jsonObject.put("parentid", menu.getParentid());
jsonObject.put("childid", menu.getChildid());
jsonObject.put("categories", menu.getCategories().getCategory());
jsonObject.put("subcategories", menu.getSubcategories().getCategory());
jsonObject.put("itemid", menu.getItems().getId());
jsonObject.put("product", menu.getItems().getProduct());
jsonObject.put("brand", menu.getItems().getBrand());
jsonObject.put("sum", menu.getItems().getSum());

它有效,但它的工作方式并不像我想象的那样。它只打印相同的值:

  • 7(id),book1(name),120(price)
  • 7(id),book1(name),120(price)
  • 8(id),car1(姓名),1620(价格)
  • 8(id),car1(姓名),1620(价格)
  • 8(id),car1(姓名),1620(价格)
  • 9(id),house1(姓名),10000(价格)
  • 9(id),house1(姓名),10000(价格)
  • 9(id),house1(姓名),10000(价格)

依旧......但不是这样:

  • 7(id),book1(name),120(price)
  • 7(id),book2(name),100(price)
  • 8(id),car1(姓名),1620(价格)
  • 8(id),car2(姓名),520(价格)
  • 8(id),car3(姓名),5520(价格)
  • 9(id),house1(姓名),10000(价格)
  • 9(id),house2(姓名),11000(价格)
  • 9(id),house3(姓名),15000(价格)

所以我的问题是我应该使用@OneToMany方法吗?或者我以错误的方式做到了?

3 个答案:

答案 0 :(得分:2)

使用@OneToOne就像为某些行扩展一个表(更多列)。

您似乎正在尝试为订单/账单以及订单/账单的位置设置关系模型。

通常(至少我会这样做)你为订单创建一个“父”表。

table order:
---------------
oder_id | customer | date | ...
--------+----------+------+-----
    1   |  cust_1  | ...  | ...
    2   |  cust_3  | ...  | ...

您的订单的位置在“子” - 表order_positions中。外键约束(order_position.order_id到order.order_id)确保数据完整性。

table order_position:
-----------------------
 id | oder_id | item     | price | ...
----+---------+----------+-------+-----
  1 |     1   |  book_1  | 100   | ...
  2 |     1   |  book_2  | 200   | ...
  3 |     2   |  car_1   | 2500  | ...
  4 |     2   |  car_2   | 234   | ...

最后回答您的问题:是的,在JPA中,您应该在您的订单实体中使用@OneToMany,并且(如果您需要双向关系){},请在您的OrderPostion-Entity中使用ManyToOne。请查看ObjectDB-Wiki

中的示例

答案 1 :(得分:1)

假设一个类别有一个菜单。类别中的正确anotation是:

    @OneToOne
(fetch = FetchType.LAZY, mappedBy = "menu", cascade = CascadeType.ALL)
private Categories subcategories;

在您的类别中,您应该有一个具有此anotation的菜单对象:

@OneToOne(fetch = FetchType.LAZY)
@PrimaryKeyJoinColumn
public Menu getMenu() {
    return this.menu;
}

public void setMenu(Menu menu) {
    this.menu= menu;
}

这是以我理解的方式做正确的方法。如果你还需要别的东西,请不要犹豫。这同样适用于类别和项目。你应该在你的类别中有这样的事情:

 @OneToOne
    (fetch = FetchType.LAZY, mappedBy = "category", cascade = CascadeType.ALL)
    private Items item;

And inside item you should have :
 @OneToOne(fetch = FetchType.LAZY)
    @PrimaryKeyJoinColumn
    public Categories getCategories() {
        return this.category;
    }

    public void setCategories(Categories  category) {
        this.category= category;
    }

答案 2 :(得分:1)

问题是@Id注释映射到错误的PrimaryKey。