Я новичок в программировании и сейчас работаю над своим первым проектом. Я хотел создать приложение для управления своими финансами. Я использую JavaFX
для своего GUI
и пытался объединить его с Hibernate
, чтобы использовать OR-Mapping для сохранения моих данных.
Позвольте мне сначала объяснить, как я строю свою «архитектуру».
У меня есть POJOs
учетная запись, книга (финансовая книга), оплата (платежи, которые перечислены в книге). Затем я получил свой database
класс (он служит контроллером между моими классами), где я выполняю все свои операции с моей базой данных, например, создаю запись в моей финансовой книге или нового пользователя / учетной записи.
В конечном итоге у меня есть для каждого экрана класс, например. LoginScreen, OverviewScreen ...
В моих классах экрана мои методы в моем классе базы данных вызываются, например, при создании новой учетной записи.
Из исследований я знаю, что вы должны передавать свои объекты или параметры в javafx
через контроллер, чтобы получить доступ к ним на другом экране.
Вот моя проблема варианта использования, с которой я сталкиваюсь и не могу найти решение:
- Я нахожусь на экране регистрации и создаю нового пользователя.
- После нажатия на кнопку регистрации создается объект пользователя с заданной им информацией, и я перенаправляюсь на экран входа в систему
- Логин этого пользователя и перенаправлен на BookScreen
- Теперь у меня есть возможность создать «Финансы» - книга
- При вводе названия книги и нажатии кнопки «Добавить» книга сохраняется, как и пользователь в базе данных, и я перенаправляюсь на экран обзора, где я вижу книгу (
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);
}
Я был бы очень благодарен, если бы вы получили несколько советов, возможно, чтобы изменить мою архитектуру или подход, чтобы сохранить мои данные.
Или у вас есть другая рекомендация, чтобы упростить доступ и сохранение данных?
Заранее большое спасибо!