2016-01-14 298 views
0

我想弄清楚我在做什麼錯了,但我正在學習hibernate註釋並創建一個簡單的庫系統。基本上,一本書得到由一個人簽出,並最終在檢查這裏是我如何配置它。映射對象與映射實體

@Entity 
@Table 
public class Book { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 
    @Column(nullable = false, unique = true) 
    private long barcode; 
    @Column(nullable = false) 
    private String name; 
    @OneToMany 
    @JoinTable(name = "checkoutsession", joinColumns = { @JoinColumn(name = "book") }, inverseJoinColumns = { @JoinColumn(name = "id")}) 
    private List<CheckOutSession> checkOutSessions; 
} 

@Entity 
public class User { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long id; 
    @Column(nullable = false, unique = true) 
    private long barcode; 
    @Column(name = "firstname") 
    private String firstName; 
    @Column(name = "lastname") 
    private String lastName; 
    @OneToMany 
    @JoinTable(name = "checkoutsession", joinColumns = { @JoinColumn(name = "user") }, inverseJoinColumns = { @JoinColumn(name = "id")}) 
    private List<CheckOutSession> checkOutSessions; 
} 

@Entity 
@Table(name = "checkoutsession", uniqueConstraints = {@UniqueConstraint(columnNames={"book", "checkIn"})}) 
public class CheckOutSession { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long id; 
    @ManyToOne 
    @JoinColumn(name="book", nullable=false) 
    private Book book; 
    @ManyToOne 
    @JoinColumn(name="user", nullable=false) 
    private User user; 
    @Column(nullable = false) 
    private java.sql.Timestamp checkOut; 
    @Column 
    private java.sql.Timestamp checkIn; 
} 

我想不出什麼我有配置不正確我的生活。

[編輯]

當我嘗試拉一本書,它選擇了從checkoutsession加入checkoutsession加入用戶去世時說在‘字段列表’「未知列checkoutsess1_.check_in;

[EDIT2]

多一點背景,我有一個擴展JpaRepository一個BookDAO,當我打電話的findAll()是什麼創建查詢。

[EDIT3]

休息類別:

@RestController 
@RequestMapping("rest/books") 
public class BookController { 

@RequestMapping(method = RequestMethod.GET) 
    public List findBooks() { 
     return bookService.getAllBooks(); 
    } 

} 

服務:

@Component 
public class BookService { 

    private BookDao bookDao; 

    public List getAllBooks() { 
     return bookDao.findAll(); 
    } 

    @Autowired 
    public void setBookDao(BookDao bookDao) { 
     this.bookDao = bookDao; 
    } 

} 

DAO:

public interface BookDao extends JpaRepository<Book, Long> { 

} 

感謝您的幫助!

+1

有什麼問題? – Reimeus

+0

你有什麼異常? – user2481857

+0

對不起,只是編輯添加我得到的問題。 –

回答

1

如果我運行您的代碼並使JPA根據它似乎能夠工作的實體生成表(至少它確實運行)。

但是,您的映射對我來說似乎很奇怪,更具體地說是@JoinTable註釋。 @JoinTable註釋通常用於有連接表時(例如checkoutSession),但不想映射它,因爲除了這兩個表之間的鏈接外,它沒有包含有用的信息。

在這種情況下,你可以使用@JoinTable註解如下:

@ManyToMany 
@JoinTable(
    name = "checkoutsession", // Name of the join table 
    joinColumns = @JoinColumn(name = "book"), // The column name in checkoutsession that links to book 
    inverseJoinColumns = @JoinColumn(name = "user") // The column name in checkoutsession that links to user 
) 
private List<User> users; 

因此,在這種情況下,您可以直接鏈接的BookUser實體,而無需創建CheckoutSession實體。

然而,在你的情況你的連接表還包含兩個時間戳,如果你需要那些在你的應用程序,那麼你就不必使用@JoinTable但簡單地使用@JoinColumn將它們連接,例如:

@OneToMany(mappedBy = "book") // The field name in CheckoutSession that links to book 
private List<CheckoutSession> checkOutSessions; 

這是你應該在你的Book實體中擁有的。請注意,在這種情況下,我們正在討論字段名稱而不是列名稱。您必須輸入映射回Book實體的字段名稱CheckoutSession

有關@JoinTable註釋的更多信息,我建議您閱讀以下答案:JPA "@JoinTable" annotationthis article

+0

就是這樣,非常感謝!我已閱讀文檔並誤解了@JoinTable註釋的用途。我用mappedBy替換了它,現在一切都按預期工作。 –