Обновление сущности JPA, включая список сущностей - PullRequest
0 голосов
/ 21 марта 2020

В общем, моя цель - проанализировать файл xml в таблицах БД, поэтому файл выглядит примерно так:

<?xml version="1.0" encoding="UTF-8"?>
<Storage>
    <Box id="1">
        <Item id="1"/>
        <Item color="red" id="2"/>
        <Box id="3">
            <Item id="3" color="red" />
            <Item id="4" color="black" />
        </Box>
        <Box id="6"/>
        <Item id="5"/>
    </Box>
    <Item id="6"/>
</Storage>

Я могу проанализировать его с помощью umarshaller, и он отлично создает объект Storage, но когда при попытке обновить ящики и элементы в БД возникает проблема. Объекты, которые я использую, выглядят так:

package com.demo.alpha.domen;

import lombok.Data;
import org.hibernate.annotations.Cascade;


import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import java.util.List;

@Data
@Entity
@Table(name = "BOX")
@XmlAccessorType(XmlAccessType.FIELD)
public class Box {
    @Id
    @Column(name = "ID")
    @XmlAttribute(name = "id")
    private int id;

    @Column(name = "CONTAINED IN")
    private int containedIn;

    @OneToMany(mappedBy = "box", cascade = {CascadeType.PERSIST, CascadeType.MERGE,
            CascadeType.DETACH, CascadeType.REFRESH}, fetch = FetchType.LAZY)
    @XmlElement(name = "Item")
    private List<Item> items;


    @ManyToOne(fetch = FetchType.LAZY)
    private Box parentBox;

    @OneToMany(mappedBy = "parentBox", cascade = {CascadeType.PERSIST, CascadeType.MERGE,
            CascadeType.DETACH, CascadeType.REFRESH}, fetch = FetchType.LAZY)
    @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
    @XmlElement(name = "Box")
    private List<Box> boxes;
}
package com.demo.alpha.domen;

import lombok.Data;

import javax.persistence.*;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;

@Data
@Entity
@Table(name = "ITEM")
@XmlAccessorType(XmlAccessType.FIELD)
public class Item {

    @Id
    @Column(name = "ID")
    @XmlAttribute(name = "id")
    private int id;

    @Column(name = "COLOR")
    @XmlAttribute(name = "color")
    private String color;

    @Column(name = "CONTAINED IN")
    private int containedIn;

    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE,
            CascadeType.DETACH, CascadeType.REFRESH},
            fetch = FetchType.LAZY)
    @JoinColumn(name = "CONTAINED_IN")
    private Box box;
}

И я не уверен, как мне сопоставить блок, включающий другие поля, потому что это та же таблица, и мне нужно, чтобы CONTAINED_IN был идентификатором родителя коробка. При попытке обновить его с помощью репозитория jpa, получите org.h2.jdb c .JdbcSQLSyntaxErrorException в этом запросе

   select
        box0_.id as id1_0_1_,
        box0_.contained in as containe2_0_1_,
        box0_.parent_box_id as parent_b3_0_1_,
        boxes1_.parent_box_id as parent_b3_0_3_,
        boxes1_.id as id1_0_3_,
        boxes1_.id as id1_0_0_,
        boxes1_.contained in as containe2_0_0_,
        boxes1_.parent_box_id as parent_b3_0_0_ 
    from
        box box0_ 
    left outer join
        box boxes1_ 
            on box0_.id=boxes1_.parent_box_id 
    where
        box0_.id=?

начальный журнал

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...