我在数据库中有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。