Как правильно использовать EntityManager при добавлении и удалении элементов из таблицы?
В настоящее время я работаю с Hibernate And JavaFX.
Мой вопрос: яиметь эту таблицу JavaFX, которая содержит объекты Fruit.class. Я добавляю и удаляю объекты в этой таблице, и когда я нажимаю Сохранить, я хочу обновить базу данных. Как мне спроектировать использование EntityManager? Должен ли я держать EntityManager открытым, пока открыт этот экран? Согласно некоторым сообщениям о SO, я должен открывать и закрывать EntityManager для каждой сделанной транзакции. Однако в этом случае «транзакция» включает в себя добавление и удаление 0 ... n объектов Fruit.class.
Другими словами, пользователь может добавлять и удалять фрукты перед сохранением.
Как мне правильно подойти к этому, относительно EntityManager?
Также можно ли использовать для операции отмены таблицы аудита из спящего режима?
public class FruitsController implements Initializable {
@FXML
private TableColumn<Fruit, Long> fruitId;
@FXML
private TableColumn<Fruit, String> fruitColor;
@FXML
private TableView<Fruit> fruitsTable;
@FXML
private Label labelTitle;
@FXML
private Button buttonSave;
@FXML
private Button undoAction;
@FXML
private MenuItem addFruitButton;
@FXML
private MenuItem removeFruitButton;
@FXML
void addFruit(ActionEvent event) {
fruitsTable.getItems().add(new Fruit());
}
@FXML
void removeFruit(ActionEvent event) {
int i = fruitsTable.getSelectionModel().getSelectedIndex();
if(i > 0){
fruitsTable.getItems().remove(i);
}else{
Toolkit.getDefaultToolkit().beep();
}
}
@FXML
void saveFruits(ActionEvent event) {
EntityManager entityManager = InitHibernate.getSessions().createEntityManager();
//fruitsTable.getItems()
entityManager.close();
}
@FXML
void undoLastAction(ActionEvent event) {
}
@Override
public void initialize(URL location, ResourceBundle resources) {
fruitId.setCellValueFactory(new PropertyValueFactory<Fruit, Long>("id"));
fruitColor.setCellValueFactory(new PropertyValueFactory<>("color"));
fruitId.setCellFactory(TextFieldTableCell.forTableColumn(new LongStringConverter()));
fruitColor.setCellFactory(TextFieldTableCell.forTableColumn());
fruitColor.setEditable(true);
fruitsTable.setEditable(true);
fruitsTable.setItems(loadFruits());
InitHibernate.initHibernate();
}
/**
* *
* It returns and load from hibernate
*
* @return
*/
private ObservableList<Fruit> loadFruits() {
EntityManager em = null;
ObservableList<Fruit> observableArrayList = null;
try {
em = InitHibernate.getSessions().createEntityManager();
FruitDAO fruitDAO = new FruitDAO(em);
observableArrayList = FXCollections.observableArrayList(fruitDAO.getLista());
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (em != null) {
em.close();
}
}
return observableArrayList;
}
}