2016-01-14 268 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替换了它,现在一切都按预期工作。 –