JPA Join Column



我在数据库中有3个表。

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

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

第三条(项)包括:id, name, price。

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

第二个表在数据库中有这些值:

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

目前我已经将列child连接到列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(name), 1620(price)
  • 8(id), car1(name), 1620(price)
  • 8(id), car1(name), 1620(price)
  • 9(id), house1(name), 10000(price)
  • 9(id), house1(name), 10000(price)
  • 9(id), house1(name), 10000(price)

等等…但这个不行:

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

我的问题是我应该使用@OneToMany方法吗?还是我做错了?

使用@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中,你应该在你的orderposition - entity中使用@OneToMany和(如果你想要一个双向关系)在你的orderposition - entity中使用ManyToOne。看一下ObjectDB-Wiki

中的示例

假设一个类别有一个菜单。正确的注释是:

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

在你的类别中,你应该有一个带有注释的菜单对象:

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

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

最新更新