2016-01-14 5 views
0

Я пытаюсь понять, что я делаю с этим неправильно, но я изучаю аннотации спящего режима и создаю простую библиотечную систему. В основном, книга получает проверили человека, и в конечном счете проверяется Вот как я это сконфигурировано:.Сопоставление объектов с объектом сопоставления

@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; 
} 

Я не могу понять, за жизнь мне, что я получил настроен неправильно.

[EDIT]

при попытке вытащить книгу он выбирающий все от checkoutsession присоединиться checkoutsession присоединиться к пользователю и умирает, говоря «Неизвестный checkoutsess1_.check_in столбца в" списке полей;

[edit2]

чуть больше контекста, у меня есть BookDAO, расширяющий JpaRepository и когда я называю FindAll() является то, что создание этого запроса.

[EDIT3]

Rest Класс:

@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; 

Таким образом, в этом случае, вы можете напрямую связать Book и User сущности без необходимости создания CheckoutSession сущность.

Однако в вашем случае ваш присоединиться к таблице также содержит две метки времени, если вам нужны те, в вашем приложении, то вы не должны использовать @JoinTable, а просто использовать @JoinColumn, чтобы соединить их, например:

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

Это то, что вы должны иметь в своем объекте Book. Имейте в виду, что в этом случае мы говорим о именах полей не о именах столбцов. Вы должны ввести имя поля в CheckoutSession, которое вернется к объекту Book.

Для получения дополнительной информации об анкете @JoinTable Я рекомендую вам прочитать этот ответ: JPA "@JoinTable" annotation или this article.

+0

Так оно и было, огромное спасибо! Я прочитал документацию и не понял, что означала аннотация @JoinTable. Я заменил его на MappedBy, и теперь все работает так, как ожидалось. –

Смежные вопросы