JavaFX и Hibernate - сохранение объектов с разных экранов - PullRequest
0 голосов
/ 07 мая 2019

Я новичок в программировании и сейчас работаю над своим первым проектом. Я хотел создать приложение для управления своими финансами. Я использую JavaFX для своего GUI и пытался объединить его с Hibernate, чтобы использовать OR-Mapping для сохранения моих данных. Позвольте мне сначала объяснить, как я строю свою «архитектуру».

У меня есть POJOs учетная запись, книга (финансовая книга), оплата (платежи, которые перечислены в книге). Затем я получил свой database класс (он служит контроллером между моими классами), где я выполняю все свои операции с моей базой данных, например, создаю запись в моей финансовой книге или нового пользователя / учетной записи.

В конечном итоге у меня есть для каждого экрана класс, например. LoginScreen, OverviewScreen ... В моих классах экрана мои методы в моем классе базы данных вызываются, например, при создании новой учетной записи. Из исследований я знаю, что вы должны передавать свои объекты или параметры в javafx через контроллер, чтобы получить доступ к ним на другом экране. Вот моя проблема варианта использования, с которой я сталкиваюсь и не могу найти решение:

  1. Я нахожусь на экране регистрации и создаю нового пользователя.
  2. После нажатия на кнопку регистрации создается объект пользователя с заданной им информацией, и я перенаправляюсь на экран входа в систему
  3. Логин этого пользователя и перенаправлен на BookScreen
  4. Теперь у меня есть возможность создать «Финансы» - книга
  5. При вводе названия книги и нажатии кнопки «Добавить» книга сохраняется, как и пользователь в базе данных, и я перенаправляюсь на экран обзора, где я вижу книгу (listview) с все платежи, которые я сделал.

Здесь вы можете увидеть, как это выглядит: https://imgur.com/a/8fQBSp6

-> Теперь моя проблема в том, что я не знаю, как подключить созданную книгу к пользователю (через внешний ключ). Я имею в виду, что книга, которую я создал с пользователем, должна иметь в таблице базы данных книги идентификатор пользователя в качестве внешнего ключа.

Я обнаружил, что могу легко добавить в список книг учетную запись и добавить в книгу учетную запись. Звучит немного странно, но это то, что я прочитал, чтобы сделать (двунаправленный) отношения OneToMany и ManyToOne. Но когда я пробую такой подход, моя книга либо пуста, либо моя учетная запись. Эта проблема связана с javafx, потому что я могу передать только один объект за раз на другой экран.

Вы можете увидеть весь мой проект на github: https://github.com/nailujf7/JF

Класс моей учетной записи:

 @Table(name = "Account") @Entity
    public class Account implements Serializable {

    @OneToMany(mappedBy = "account")
    private List<Book> bookList = new ArrayList<>();

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;
    @Column (name ="firstname")
    private String firstname;
    @Column (name ="lastname")
    private String lastname;
    @Column (name ="date_of_birth")
    private Date dateOfBirth;
    @Column (name ="username")
    private String username;
    @Column (name ="password")
    private String password;

    public Account(){}

    public Account(String firstname, String lastname, Date dateOfBirth, String username, String password) {
        this.firstname = firstname;
        this.lastname = lastname;
        this.dateOfBirth = dateOfBirth;
        this.username = username;
        this.password = password;
    }

    public List<Book> getBookList() {
        return bookList;
    }

    public void setBookList(List<Book> bookList) {
        this.bookList = bookList;
    }

    public int getId() {
        return id;
    }

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public Date getDateOfBirth() {
        return dateOfBirth;
    }

    public void setDateOfBirth(Date dateOfBirth) {
        this.dateOfBirth = dateOfBirth;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

Класс моей книги:

  @Table(name = "Book")@Entity
    public class Book implements Serializable {

    public Book() {
    }

    public Book(String bookName) {
        this.bookName = bookName;
    }

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "id")
    private Account account;
    @Column(name = "bookName")
    private String bookName;
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "book_id")
    private int book_id;
    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "payment_id")
    @OrderColumn(name = "index_payment_list")
    private List<Payment> paymentList;


    public int getBook_id() {
        return book_id;
    }

    public void setBook_id(int book_id) {
        this.book_id = book_id;
    }

    public List<Payment> getPaymentList() {
        return paymentList;
    }

    public void setPaymentList(List<Payment> paymentList) {
        this.paymentList = paymentList;
    }


    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public Account getAccount() {
        return account;
    }

    public void setAccount(Account account) {
        this.account = account;
    }
}

и мой класс базы данных:

 public class Database {

    private static Session currentSession;
    private static Transaction currentTransaction;
    private Book book;
    private List user;

    public Account getAccount() {
        return account;
    }

    public void setAccount(Account account) {
        this.account = account;
    }

    private Account account;

    public static Session openCurrentSession() {
        currentSession = getSessionFactory().openSession();
        return currentSession;
    }

    public Session openCurrentSessionwithTransaction() {
        currentSession = getSessionFactory().openSession();
        currentTransaction = currentSession.beginTransaction();
        return currentSession;
    }

    public void closeCurrentSession() {
        currentSession.close();
    }

    public void closeCurrentSessionwithTransaction() {
        currentTransaction.commit();
        currentSession.close();
    }

    private static SessionFactory getSessionFactory() {
        Configuration configuration = new Configuration().configure();
        StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
                .applySettings(configuration.getProperties());
        return configuration.
                addPackage("model").
                addAnnotatedClass(Payment.class).
                addAnnotatedClass(Book.class).
                addAnnotatedClass(Account.class).
                buildSessionFactory(builder.build());
    }

    public Session getCurrentSession() {
        return currentSession;
    }

    public void setCurrentSession(Session currentSession) {
        this.currentSession = currentSession;
    }

    public Transaction getCurrentTransaction() {
        return currentTransaction;
    }

    public void setCurrentTransaction(Transaction currentTransaction) {
        this.currentTransaction = currentTransaction;
    }


    public boolean checkUserData(String usernamer, String password) {
        account = new Account();
        account.setUsername(usernamer);
        account.setPassword(password);
        String query = "from model.Account acc where acc.username = :username " +
                "and acc.password = :password";
        Query q = openCurrentSession().createQuery(query);
        user = q.setProperties(account).list();
        System.out.println(user.size());
        if (!user.isEmpty()) {
           account=  ((Account) user.iterator().next());
            return true;
        } else {
            return false;
        }
    }

    public void addBook(String bookName) {
        openCurrentSessionwithTransaction();
        book = new Book(bookName);
        getCurrentSession().save(book);
        closeCurrentSessionwithTransaction();
        persistAccountAndBook();

    }

    public void createAccount(String firstname, String lastname, Date date, String username, String password) {
        openCurrentSessionwithTransaction();
        account = new Account(firstname, lastname, date, username, password);
        getCurrentSession().save(account);
        closeCurrentSessionwithTransaction();
    }

    public void persistAccountAndBook(){
        account = new Account("ha","ha",null, "ha","ha");
        account.getBookList().add(book);
        book.setAccount(account);
    }

Я был бы очень благодарен, если бы вы получили несколько советов, возможно, чтобы изменить мою архитектуру или подход, чтобы сохранить мои данные. Или у вас есть другая рекомендация, чтобы упростить доступ и сохранение данных? Заранее большое спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...