Исключение сопоставления Hibernate: не удалось определить тип для столбцов: [org.hibernate.mapping.Column]
Я хочу сделать сопоставление "один ко многим" между двумя таблицами BookStock и Book, но я получаю следующее исключение.
Exception in thread "main" org.hibernate.MappingException: Could not determine type for: java.util.List, at table: book_stock, for columns: [org.hibernate.mapping.Column(books)]
Объект bookStock
@Entity
@Table(name = "book_stock")
public class BookStock {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Long stock;
private List<Book> books;
@Column(name = "id")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name = "stock")
public Long getStock() {
return stock;
}
public void setStock(Long stock) {
this.stock = stock;
}
@OneToMany
@PrimaryKeyJoinColumn
public List<Book> getBooks() {
return books;
}
public void setBooks(List<Book> books) {
this.books = books;
}
}
Объект книги
@Entity
@Table(name = "book")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String bookName;
private BigDecimal price;
private BookStock bookStock;
@Column(name = "id")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name = "book_name")
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
@Column(name = "price")
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
@ManyToOne
public BookStock getBookStock() {
return bookStock;
}
public void setBookStock(BookStock bookStock) {
this.bookStock = bookStock;
}
}
Класс Example
public class transactionsExample {
public static void main(String[] args) {
AnnotationConfiguration configuration = new AnnotationConfiguration();
configuration.configure();
configuration.addAnnotatedClass(Book.class);
configuration.addAnnotatedClass(BookStock.class);
configuration.setNamingStrategy(ImprovedNamingStrategy.INSTANCE);
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
session.beginTransaction();
Book book1 = EntityBuilder.book().withISBN("21234").withName("Anario").withPrice(25.90).purchase();
session.save(book1);
session.getTransaction().commit();
}
}
Что не так в этом отношении?
Ответы
Ответ 1
Он не находит все ваши аннотации, потому что вы аннотируете оба поля и методы. Вы должны использовать только одну стратегию. В вашем случае первая заметка @Id в поле id видна, и поэтому аннотации в методах get не имеют эффекта. В результате спящий режим предполагает, что
List<Book> books;
не отображается. Если вы перемещаете также аннотации из поля id в getId-метод (для обоих объектов), проблема решается.
Об устранении других проблем с сопоставлениями см. комментарий ниже.