ORA-00904: "BOOKORDERS": неверный идентификатор в Hibernate

У меня проблема с вставкой информации о заказе в базу данных оракула. Когда я вызываю функцию createOrder в классе JUnit, она выдает ошибку, как показано ниже.

Hibernate: select ORDERS_SEQ.nextval from dual
Hibernate: insert into BOOKORDERS (CUSTOMER_ID, ORDER_DATE, ORDER_STATUS, 
ORDER_TOTAL, PAYMENT_METHOD, RECIPIENT_NAME, RECIPIENT_PHONE, 
SHIPPING_ADDRESS, ORDER_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into DETAILORDER (quantity, subTotal, book, bookorders) 
values (?, ?, ?, ?)
May 22, 2019 12:26:18 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper 
logExceptions
WARN: SQL Error: 904, SQLState: 42000
May 22, 2019 12:26:18 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper 
logExceptions
ERROR: ORA-00904: "BOOKORDERS": invalid identifier

Как я могу это исправить?

Я могу поделиться соответствующими кодами классов Order с соответствующими классами в пакете сущностей.

Класс BookOrders

    @Entity
    @Table(name="BOOKORDERS",catalog = "JSPPROJECTDATABASE")
    public class BookOrders implements Serializable{
    ...

    @Id
    @SequenceGenerator(name="ORDERS_SEQ", sequenceName="ORDERS_SEQ", allocationSize=1)
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="ORDERS_SEQ")
    @Column(name="ORDER_ID", nullable = false)
    private int id;

    @OneToMany(fetch = FetchType.EAGER,mappedBy = "pk.bookorders", cascade=CascadeType.ALL,orphanRemoval = true)
        private Set<DetailOrder> orderDetails = new HashSet<DetailOrder>();
    }

Книжный класс

@Entity
@Table(name="BOOK",catalog = "JSPPROJECTDATABASE"){
        ...

@Id
@SequenceGenerator(name="BOOK_SEQ", sequenceName="BOOK_SEQ", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="BOOK_SEQ")
@Column(name="BOOK_ID", nullable = false)
private int id; 

@OneToMany(fetch = FetchType.EAGER,mappedBy = "pk.book", cascade=CascadeType.ALL)
private Set<DetailOrder> detailOrders = new HashSet<DetailOrder>(); }

Подробный класс заказа

@Entity
@Table(name = "DETAILORDER", catalog = "JSPPROJECTDATABASE")
@AssociationOverrides({
        @AssociationOverride(name = "pk.bookorders", 
            joinColumns = @JoinColumn(name = "ORDER_ID")),
        @AssociationOverride(name = "pk.book", 
            joinColumns = @JoinColumn(name = "BOOK_ID")) })
public class DetailOrder implements Serializable{

private DetailOrderId pk = new DetailOrderId();

    @Id
    @SequenceGenerator(name="DETAIL_ORDER_SEQ", sequenceName="DETAIL_ORDER_SEQ", allocationSize=1)
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="DETAIL_ORDER_SEQ")
    @Column(name="DETAIL_ORDER_ID", nullable = false)
    private int id;

    @ManyToOne(fetch = FetchType.EAGER,cascade=CascadeType.ALL)
    @JoinColumn(name = "BOOK_ID")
    private Book book;

    @ManyToOne(fetch = FetchType.EAGER,cascade=CascadeType.ALL)
    @JoinColumn(name = "ORDER_ID")
    private BookOrders bookorders;

    @Column(name="QUANTITY")
    private int quantity;

    @Column(name="SUBTOTAL")
    private float subTotal;

    @EmbeddedId
    public DetailOrderId getPk() {
        return pk;
    }

    public void setPk(DetailOrderId pk) {
        this.pk = pk;
    }
}

Класс DetailOrderId

@Embeddable
public class DetailOrderId implements Serializable{

    @ManyToOne(fetch = FetchType.EAGER,cascade=CascadeType.ALL)
    @JoinColumn(name = "BOOK_ID")
    private Book book;

    @ManyToOne(fetch = FetchType.EAGER,cascade=CascadeType.ALL)
    @JoinColumn(name = "ORDER_ID")
    private BookOrders bookorders;
}

Тестовый код вставки

@Test
    public void testCreateOrder() {
        System.out.println("testCreateOrder");
        BookOrders bookorders = new BookOrders();

        Customer customer = new Customer();
        customer.setId(42);

        bookorders.setCustomer(customer);
        bookorders.setRecipentName("Recipent Name");
        bookorders.setRecipentPhone("123456789");
        bookorders.setShippingAddress("Address");

        Set<DetailOrder> orderDetails = new HashSet<DetailOrder>();
        DetailOrder detailOrder = new DetailOrder();

        Book book = new Book(24);
        detailOrder.setBook(book);
        detailOrder.setQuantity(1);
        detailOrder.setSubTotal(33.99f);
        detailOrder.setOrders(bookorders);

        orderDetails.add(detailOrder);

        bookorders.setOrderDetails(orderDetails);

        BookOrders savedOrders = ordersDAO.create(bookorders);

        assertNotNull(savedOrders);
        //assertTrue(savedOrders.getId() > 0);


    }

Колонка "BOOKORDERS" существует?

J_D 22.05.2019 11:52

вставить в DETAILORDER (количество, промежуточный итог, книга, книжные заказы) значения (?, ?, ?, ?) - похоже, проблема в этом.

J_D 22.05.2019 11:58

Покажите код Java, который вы запускаете для вставки

Nikolai Shevchenko 22.05.2019 12:15

всякий раз, когда вы хотите отправить сообщение отдельному человеку, добавьте к имени префикс @, например, @J_D

Barbaros Özhan 22.05.2019 17:16

@J_D Я редактирую свой пост.

Tomas Jonas 22.05.2019 17:32

@NikolayShevchenko редактирую свой пост

Tomas Jonas 22.05.2019 17:33

@BarbarosÖzhan Хорошо. Как я могу исправить свою ошибку.

Tomas Jonas 22.05.2019 17:34

Я думаю, что код ошибки подразумевает то, что предлагает @J_D...

Barbaros Özhan 22.05.2019 17:37

@BarbarosÖzhan Не могли бы вы помочь мне, какой класс выдает ошибку. Когда я изменил переменные, возникла проблема с сопоставлением.

Tomas Jonas 22.05.2019 17:39

@BarbarosÖzhan bookorders связан с detailorder с его составным идентификатором.

Tomas Jonas 22.05.2019 17:41

Я не очень разбираюсь в Java для практических проектов, но, похоже, detailOrder.setOrders(bookorders); следует удалить.

Barbaros Özhan 22.05.2019 17:43

@BarbarosÖzhan Когда я удаляю упомянутый вами код, правильно работает только первый код sql. Другая часть sql, связанная с DETAILORDER, не может работать, и ее значения не могут быть вставлены в базу данных. Но я хочу запустить два кода sql.

Tomas Jonas 22.05.2019 17:47

@J_D Как я могу внести исправления в класс DETAILORDER

Tomas Jonas 22.05.2019 18:05

@BarbarosÖzhan Я могу добавить <property name="hibernate.hbm2ddl.auto">обновление</property> в hibernate.cfg.xml. И запускаю код. Два кода sql работают отлично, а дополнительные два столбца Bookorder и Book в DetailOrder. Эти два столбца имеют long raw и raw и имеют значения. Однако для Order_ID и Book_ID нельзя установить какое-либо значение (они равны нулю).

Tomas Jonas 22.05.2019 23:55
Основы программирования на Java
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
Концепции JavaScript, которые вы должны знать как JS программист!
Концепции JavaScript, которые вы должны знать как JS программист!
JavaScript (Js) - это язык программирования, объединяющий HTML и CSS с одной из основных технологий Всемирной паутины. Более 97% веб-сайтов используют...
0
14
727
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я решил проблему.

Класс DetailOrder

public class DetailOrder implements Serializable{

    @EmbeddedId
    @AttributeOverrides({ @AttributeOverride(name = "ORDER_ID", column = @Column(name = "ORDER_ID", nullable = false)),
        @AttributeOverride(name = "BOOK_ID", column = @Column(name = "BOOK_ID", nullable = false))})
    private DetailOrderId pk = new DetailOrderId();

    @ManyToOne(fetch = FetchType.EAGER,cascade=CascadeType.ALL)
    @JoinColumn(name = "BOOK_ID", insertable = false, updatable = false, nullable = false)
    private Book book;

    @ManyToOne(fetch = FetchType.EAGER,cascade=CascadeType.ALL)
    @JoinColumn(name = "ORDER_ID", insertable = false, updatable = false, nullable = false)
    private BookOrders bookorders;  }

Класс DetailOrderId

@Embeddable
public class DetailOrderId implements Serializable{

    @ManyToOne(fetch = FetchType.EAGER,cascade=CascadeType.ALL)
    @JoinColumn(name = "BOOK_ID", insertable = false, updatable = false, nullable = false)
    private Book book;

    @ManyToOne(fetch = FetchType.EAGER,cascade=CascadeType.ALL)
    @JoinColumn(name = "ORDER_ID", insertable = false, updatable = false, nullable = false)
    private BookOrders bookorders;

Класс BookOrder

@OneToMany(fetch = FetchType.EAGER,mappedBy = "pk.bookorders", cascade=CascadeType.ALL)
    private Set<DetailOrder> orderDetails = new HashSet<DetailOrder>();

Книжный класс

@OneToMany(fetch = FetchType.EAGER,mappedBy = "pk.book", cascade=CascadeType.ALL)
    private Set<DetailOrder> detailOrders = new HashSet<DetailOrder>();

Другие вопросы по теме