2015-07-30 5 views
1

У меня есть 3 таблицы в базе данных.JPA Join Column

Первый (категории) включает в себя: идентификатор категории, IsActive

Второй один (меню) включает в себя: ParentID и childid.

Третий (элементы) включает в себя: идентификатор, имя и цену.

Первый стол имеет отношения со вторым. Я хочу сделать отношения между вторым и третьим сейчас.

Вторая таблица имеет следующие значения в базе данных:

  • 7 (ид), Книга1 (имя), 120 (цена)
  • 7 (идентификатор), book2 (имя), 100 (цена)
  • 8 (ID), car1 (имя), 1620 (цена)
  • 8 (ID), car2 (имя), 520 (цена)
  • 8 (ID), car3 (имя), 5520 (цена)
  • 9 (id), house1 (наименование), 10000 (цена)
  • 9 (идентификатор), Дом2 (имя), 11 000 (цена)
  • 9 (идентификатор), house3 (имя), 15000 (цена)

На данный момент я присоединился к колонку childid колонки идентификатору ,

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), Книга1 (имя), 120 (цена)
  • 7 (идентификатор), BOOK1 (имя), 120 (цена)
  • 8 (ID) , car1 (имя), 1620 (цена)
  • 8 (ID), car1 (имя), 1620 (цена)
  • 8 (ID), car1 (имя), 1620 (цена)
  • 9 (идентификатор), дом1 (имя), 10000 (цена)
  • 9 (id), house1 (имя), 10000 (цена)
  • 9 (id), house1 (имя), 10000 (цена)

и так далее ...Но не это:

  • 7 (идентификатор), Книга1 (имя), 120 (цена)
  • 7 (идентификатор), book2 (имя), 100 (цена)
  • 8 (идентификатор), car1 (имя), 1620 (цена)
  • 8 (ID), car2 (имя), 520 (цена)
  • 8 (ID), car3 (имя), 5520 (цена)
  • 9 (ID), дом1 (имя), 10000 (цена)
  • 9 (id), дом2 (имя), 11000 (цена)
  • 9 (id), house3 (имя), 15000 (цена)

Так что мой вопрос в том, должен ли я использовать метод @OneToMany? Или я делаю это неправильно?

+0

, если быть честным, я действительно не понимаю, чего вы пытаетесь достичь. можете ли вы предоставить более подробную информацию? возможно, включите классы в вопрос? – giannisapi

+0

Я сделал редактирование. – Laurynas

ответ

1

Проблема @Id аннотации отображаются в неправильный PrimaryKey.

2

Использование @OneToOne походит на расширение таблицы (больше столбцов) для некоторых строк.

Похоже, вы пытаетесь создать модель отношений для заказов/счетов и позиций заказов/счетов.

Обычно (по крайней мере, я бы это сделал) вы создаете «родительскую» таблицу для заказов.

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

Позиции вашего заказа находятся в "child" -table 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 | ... 

Чтобы окончательно AnSer ваш вопрос: Да, в JPA вы должны использовать @OneToMany в вашем Одер-Сущности и (если вы хотите двунаправленную связь) ManyToOne в вашем OrderPostion-Сущности. Взгляните на примеры в ObjectDB-Wiki

1

Усвоение одной категории имеет одно меню. Правильная внутри категории этой заметки является:

@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 пути я понимаю это. если вам нужно что-то еще, не стесняйтесь спрашивать. То же самое относится к категории и элементу. Вы должны somethind, как это в вашей категории:

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

Спасибо за ваш ответ. Но это не то, что я ищу. Категории.java и Items.java - это okey (например, Категории.java). Проблема заключается в Menu.java, поскольку он печатает только одно значение (несколько раз такое же имя, имя или сумма) каждого дочернего элемента. – Laurynas

+0

что вы действительно хотите напечатать? то, что вы печатаете, вероятно, зависит от запроса, который делает, а не от отношения. – giannisapi

+0

. Пожалуйста, внимательно ознакомьтесь со своим сообщением, чтобы увидеть, что напечатано и что ожидается напечатать. – Laurynas