我在数据库中有3个表。
第一个(类别)包括:id,category,isactive
第二个(菜单)包括:parentid和childid。
第三项(项目)包括:身份证,姓名和价格。
第一张表与第二张表有关系。我现在想做第二和第三之间的关系。
第二个表在数据库中包含以下值:
目前我已将列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());
它有效,但它的工作方式并不像我想象的那样。它只打印相同的值:
依旧......但不是这样:
所以我的问题是我应该使用@OneToMany方法吗?或者我以错误的方式做到了?
答案 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。