latata
latata

Reputation: 1723

hibernate many to one annotations - mapping exception

I have to tables book and borrow and I want to have in my Borrow class method to get Book. I have something like this:

    @Entity
@Table(name="borrow")
public class Borrow {
    @Id
    @Column(name="ID")
    @GeneratedValue
    private Long id;

    @Column(name="book_id")
    private long bookId;

    @Column(name="user_id")
    private long userId;

    @Column(name="borrow_date")
    private Date borrowDate;

    @Column(name="return_date")
    private Date returnDate;

    private Book book;

    public long getBookId() {
        return bookId;
    }

    public void setBookId(long bookId) {
        this.bookId = bookId;
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id", nullable = false)
    @ForeignKey(name = "id")
    public Book getBook() {
        return this.book;
    }

    public void setBook(Book book) {
        this.book = book;
    }

    public long getUserId() {
        return userId;
    }

    public void setUserId(long userId) {
        this.userId = userId;
    }

    public Date getBorrowDate() {
        return borrowDate;
    }

    public void setBorrowDate(Date borrowDate) {
        this.borrowDate = borrowDate;
    }

    public Date getReturnDate() {
        return returnDate;
    }

    public void setReturnDate(Date returnDate) {
        this.returnDate = returnDate;
    }

}

In table book I have id field and I want to join by it. Like book.id = borrow.book_id. I get execption:

Could not determine type for: Book, at table: borrow, for columns: [org.hibernate.mapping.Column(book)]

Book class:

    @Entity
@Table(name="book")
public class Book {
    @Id
    @Column(name="ID")
    @GeneratedValue
    private Long id;

    @Column(name="title")
    private String title;

    @Column(name="author")
    private String author;

    @Column(name="isbn")
    private String isbn;

    @Column(name="year")
    private String year;

    @Column(name="publisher")
    private String publisher;

    @Column(name="book_url")
    private String bookUrl;

    @Column(name="review_url")
    private String reviewUrl;

    @Column(name="status_id")
    private int status;

    @Column(name="accepted")
    private boolean accepted;

    @Column(name="in_library")
    private boolean inLibrary;

    @Column(name="user_id")
    private long userId;

    public long getUserId() {
        return userId;
    }

    public void setUserId(long userId) {
        this.userId = userId;
    }

    public boolean isAccepted() {
        return accepted;
    }

    public void setAccepted(boolean accepted) {
        this.accepted = accepted;
    }

    public boolean isInLibrary() {
        return inLibrary;
    }

    public void setInLibrary(boolean inLibrary) {
        this.inLibrary = inLibrary;
    }

    public Book(long l, String string) {
        this.title = string;
        this.id = l;
    }


    public Book() {
    }

    public Long getId() {
        return id;
    }

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

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getIsbn() {
        return isbn;
    }

    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }

    public String getYear() {
        return year;
    }

    public void setYear(String year) {
        this.year = year;
    }

    public String getPublisher() {
        return publisher;
    }

    public void setPublisher(String publisher) {
        this.publisher = publisher;
    }

    public String getBookUrl() {
        return bookUrl;
    }

    public void setBookUrl(String bookUrl) {
        this.bookUrl = bookUrl;
    }

    public String getReviewUrl() {
        return reviewUrl;
    }

    public void setReviewUrl(String reviewUrl) {
        this.reviewUrl = reviewUrl;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }




}

Upvotes: 2

Views: 2277

Answers (1)

DannyMo
DannyMo

Reputation: 11984

The issue is that you're mixing field and property access. Your @Id annotation is on a field, so that's where hibernate is looking for book's annotation. From 2.2.2.2. Access type:

The placement of annotations within a class hierarchy has to be consistent (either field or on property) to be able to determine the default access type. It is recommended to stick to one single annotation placement strategy throughout your whole application.

So either keep your annotations consistent (recommended), or use the methods described in the rest of that section to override the access type for book (e.g. by using the @Access annotation)

Upvotes: 2

Related Questions