【问题标题】:JPA Join ColumnJPA 加入专栏
【发布时间】:2015-10-21 10:49:31
【问题描述】:

我在数据库中有 3 个表。

第一个(categories)包括:id、category、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(名称),15000(价格)

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

菜单.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(名称),15000(价格)

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

【问题讨论】:

  • 说实话,我真的不明白你想要达到什么目的。你能提供更多细节吗?也许包括你所问的课程?

标签: java jquery mysql database jpa


【解决方案1】:

使用@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 中,您应该在您的 Oder-Entity 中使用 @OneToMany,并且(如果您想要双向关系)在您的 OrderPostion-Entity 中使用 ManyToOne。看看ObjectDB-Wiki中的例子

【讨论】:

    【解决方案2】:

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

        @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 的正确方法。如果您需要其他任何东西,请不要犹豫。这同样适用于类别和项目。你应该在你的类别中有这样的东西:

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

    【讨论】:

    • 感谢您的回答。但这不是我要找的。 Categories.java 和 Items.java 是好的(Categories.java 是肯定的)。问题出在 Menu.java 中,因为它只打印每个 childid 的相同值(多次相同的 id、名称或总和)。
    • 您真正想要打印的是什么?您打印的内容可能取决于生成的查询而不是关系
    • 请仔细查看我的帖子,看看打印的内容和预期打印的内容。
    • 我是 currius,因为您在类别和菜单之间存在一对一的关系,此行的实际作用是:menu.getCategories().getCategory()?
    • 从类别表中获取类别。 menu.getSubcategories().getCategory()) 从类别表中获取子类别。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-22
      • 2021-05-21
      • 1970-01-01
      • 2017-09-29
      • 2013-09-11
      • 2011-06-15
      相关资源
      最近更新 更多