У меня проблема с вставкой информации о заказе в базу данных оракула. Когда я вызываю функцию 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);
}
вставить в DETAILORDER (количество, промежуточный итог, книга, книжные заказы) значения (?, ?, ?, ?) - похоже, проблема в этом.
Покажите код Java, который вы запускаете для вставки
всякий раз, когда вы хотите отправить сообщение отдельному человеку, добавьте к имени префикс @
, например, @J_D
@J_D Я редактирую свой пост.
@NikolayShevchenko редактирую свой пост
@BarbarosÖzhan Хорошо. Как я могу исправить свою ошибку.
Я думаю, что код ошибки подразумевает то, что предлагает @J_D...
@BarbarosÖzhan Не могли бы вы помочь мне, какой класс выдает ошибку. Когда я изменил переменные, возникла проблема с сопоставлением.
@BarbarosÖzhan bookorders связан с detailorder с его составным идентификатором.
Я не очень разбираюсь в Java для практических проектов, но, похоже, detailOrder.setOrders(bookorders);
следует удалить.
@BarbarosÖzhan Когда я удаляю упомянутый вами код, правильно работает только первый код sql. Другая часть sql, связанная с DETAILORDER, не может работать, и ее значения не могут быть вставлены в базу данных. Но я хочу запустить два кода sql.
@J_D Как я могу внести исправления в класс DETAILORDER
@BarbarosÖzhan Я могу добавить <property name = "hibernate.hbm2ddl.auto">обновление</property> в hibernate.cfg.xml. И запускаю код. Два кода sql работают отлично, а дополнительные два столбца Bookorder и Book в DetailOrder. Эти два столбца имеют long raw и raw и имеют значения. Однако для Order_ID и Book_ID нельзя установить какое-либо значение (они равны нулю).
Я решил проблему.
Класс 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>();
Колонка "BOOKORDERS" существует?