2016-06-22 3 views
0

Я использую Hibernate для управления следующим соотношением:Hibernate ManyToOne Повторяя отношения

Dashboard.java:

@Entity 
@Table(name = "dashboard") 
public class Dashboard { 
    @Id 
    @Column(name = "dashboard_id", nullable = false) 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long id; 
    @Column(name = "type", nullable = false) 
    private String type; 
    @Column(name = "name", nullable = false) 
    private String name; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @OneToOne 
    @JoinColumn(name = "user_id", updatable = false) 
    private User user; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "dashwidgets") 
    public List<Widget> widgets; 

    public User getUser() { 
     return user; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 

    public long getId() { 
     return id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    public String getType() { 
     return type; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 

} 

и Widget.java

@Entity 
@Table(name = "Widget") 
public class Widget { 
    @Id 
    @Column(name = "widget_id", nullable = false) 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long id; 
    @OneToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "widgetlayout_id") 
    private WidgetLayout layout; 

    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "dashboard_id") 
    public Dashboard dashwidgets; 

    public WidgetLayout getLayout() { 
     return layout; 
    } 

    public void setLayout(WidgetLayout layout) { 
     this.layout = layout; 
    } 

    @Column(name = "widget_type", nullable = false) 
    private String widgetType; 

    public Widget() { 

    } 

    public Widget(long id, String widgetType) { 
     this.id = id; 
     this.widgetType = widgetType; 
    } 

    @Column(name = "resizeable") 
    public boolean resizable; 

    @Column(name = "canpopout") 
    public boolean canpopout; 

    @Column(name = "settings", columnDefinition = "CLOB NOT NULL") 
    public String settings; 

    public long getId() { 
     return id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    public String getWidgetType() { 
     return widgetType; 
    } 

    public void setWidgetType(String widgetType) { 
     this.widgetType = widgetType; 
    } 
} 

Что я ожидал что панель инструментов может содержать список виджетов. Каждый виджет принадлежит одной приборной панели. Тем не менее, генерируемый POJO выглядит следующим образом:

{ 
    "Id": 0, 
    "Type": "string", 
    "Name": "string", 
    "User": { 
    "Id": 0, 
    "Username": "string" 
    }, 
    "Widgets": [ 
    { 
     "Id": 0, 
     "Layout": { 
     "Id": 0, 
     "Col": 0, 
     "Row": 0, 
     "Sizex": 0, 
     "Sizey": 0 
     }, 
     "Dashwidgets": {}, 
     "WidgetType": "string", 
     "Resizable": false, 
     "Canpopout": false, 
     "Settings": "string" 
    } 
    ] 
} 

По какой-то причине Это добавление «Виджеты»: как правильное POJO, а затем дополнительно «Dashwidgets»: {}.

Когда я сохраняю объект, сохраняется только объект DashWidgets.

Что я делаю неправильно?

ответ

0

Снять mappedBy с виджетами. Когда вы добавляете `mappedBy ', на самом деле дает контроль над сохранением объекта дочернему объекту.

@OneToMany(cascade = CascadeType.ALL) 
public List<Widget> widgets; 

Отъезд this вопрос для получения дополнительной информации.

+0

Пробовал, что модель все еще выходит один и тот же: '{ "ID": 0, "типа": "строка", "имя": "строка", "пользователь": { " идентификатор ": 0, "имя пользователя": "строка" }, "виджетов": [ { "ID": 0, "раскладка": { "идентификатор": 0, "Col": 0 , "row": 0, "sizex": 0, "sizey": 0 }, "dashwidgets": {}, " widgetType ": "строка", "изменяемая": ложь, "canpopout": ложь, "Настройка": "строка" } ] }' – user171943

+0

Перед сохранением объекта, установить родитель на ребенке, а также. 'widget.setDashWidget (dashboard)' для каждого дочернего элемента. Возможно, вам понадобится добавить метод setter в дочерний элемент. Кроме того, вы можете избавиться от этого родительского объекта от Child и позволить Hibernate создавать таблицу соединений самостоятельно из Parent. – techtabu

Смежные вопросы