JavaFX + Hibernate(JPA)持久性+ Derby DB

我正在开发一个Java桌面应用程序,并且对使用JavaFX非常感兴趣。 我打算使用MVC架构,因为我有一些Java EE和MVC模型的经验。

我想将数据存储在嵌入式derby数据库中并使用Hibernate作为持久层,但我找不到一个关于用hibernate和JavaFX实现MVC的好教程。

我已经创建了持久性文件,但我不确定如何使它与JavaFX一起使用。 在Java EE中,我注入EJB服务或DAO,但由于我的应用程序不是服务器连接,我想我不能这样做。

有人可以解释我如何实现这一目标吗? 可以一起使用它们吗?

在我最近的一个JavaFX项目中,我在我的服务层下创建了一个DataBroker类,它可以对数据库执行所有CRUD操作。

例:

public class DataBroker { private EntityManager em; public DataBroker() { init(); } private void init() { this.em = Persistence.createEntityManagerFactory("").createEntityManager(); } public Person saveOrUpdate(Person entity) { em.getTransaction().begin(); T savedEntity = em.merge(entity); em.getTransaction().commit(); return savedEntity; } public List getAllPersons() { TypedQuery query = em.createNamedQuery(Person.GET_ALL, Person.class); return query.getResultList(); } } 

如果您只需要一个DataBroker实例,您可以将其实现为Singleton,如果您需要实例池,则创建一个Pool。 这是Application Server的优势,他为您完成所有这些操作,您只需要注释您的类或成员。

我希望这能帮到您。

编辑/更新这是EclipseLink 2.1的一个工作示例,但它只是持久性提供程序,因此它也适用于Hibernate。

我在上面的例子中创建了一个DataBroker,它实现了我的IDataBroker接口并覆盖了这些方法。

IDataBroker

 import de.professional_webworkx.crm.domain.Person; import java.util.List; public interface IDateBroker { public abstract void saveOrUpdate(Person person); public abstract List getAllPersons(); public abstract Person getPersonById(int id); public abstract Person getPersonByEmail(String email); } 

DataBroker – 并非每个方法都实现了……

 import de.professional_webworkx.crm.domain.Person; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.Persistence; /** * * @author Patrick Ott  * @version 1.0 */ public class DataBroker implements IDateBroker { private EntityManager em; public DataBroker() { em = Persistence.createEntityManagerFactory("CRMPU").createEntityManager(); } @Override public void saveOrUpdate(Person person) { em.getTransaction().begin(); em.merge(person); em.getTransaction().commit(); } @Override public List getAllPersons() { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public Person getPersonById(int id) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public Person getPersonByEmail(String email) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } } 

IPersonService接口

 import de.professional_webworkx.crm.domain.Person; import java.util.List; public interface IPersonService { void saveOrUpdate(Person person); List getAllPersons(); Person getPersonById(int id); Person getPersonByEmail(String email); } 

PersonService

 import de.professional_webworkx.crm.databroker.DataBroker; import de.professional_webworkx.crm.databroker.IDateBroker; import de.professional_webworkx.crm.domain.Person; import java.util.List; public class PersonService implements IPersonService { private IDateBroker broker; public PersonService() { broker = new DataBroker(); } @Override public void saveOrUpdate(Person person) { broker.saveOrUpdate(person); } @Override public List getAllPersons() { return broker.getAllPersons(); } @Override public Person getPersonById(int id) { return broker.getPersonById(id); } @Override public Person getPersonByEmail(String email) { return broker.getPersonByEmail(email); } } 

我们的域类人员

 import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; @Entity @Table(name = "person") public class Person implements Serializable { private long id; private String firstName; private String lastName; private String eMail; public Person() { } public Person(String firstName, String lastName, String eMail) { this.firstName = firstName; this.lastName = lastName; this.eMail = eMail; } @Id @GeneratedValue(strategy = GenerationType.AUTO) public long getId() { return id; } public void setId(long id) { this.id = id; } @Size(min = 2, max = 255, message = "Enter between 2 and 255 characters!") @Column(name = "firstname") @NotNull public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } @Column(name = "lastname") @NotNull public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } @NotNull public String geteMail() { return eMail; } public void seteMail(String eMail) { this.eMail = eMail; } } 

FXMLController

 import de.professional_webworkx.crm.business.IPersonService; import de.professional_webworkx.crm.business.PersonService; import de.professional_webworkx.crm.domain.Person; import java.net.URL; import java.util.ResourceBundle; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Label; public class FXMLController implements Initializable { private IPersonService service; @FXML private Label label; @FXML private void handleButtonAction(ActionEvent event) { Person p = new Person("Demo", "User", "demo@example.com"); service.saveOrUpdate(p); } @Override public void initialize(URL url, ResourceBundle rb) { // get an instance of PersonService service = new PersonService(); } } 

最后但并非最不重要的是MainApp启动应用程序。

 import javafx.application.Application; import static javafx.application.Application.launch; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; public class MainApp extends Application { @Override public void start(Stage stage) throws Exception { Parent root = FXMLLoader.load(getClass().getResource("/fxml/Scene.fxml")); Scene scene = new Scene(root); scene.getStylesheets().add("/styles/Styles.css"); stage.setTitle("JavaFX and Maven"); stage.setScene(scene); stage.show(); } public static void main(String[] args) { launch(args); } } 

这是使用Netbeans 8创建的标准Maven JavaFX项目。如有必要,我可以将源上传到GitHub或其他东西..

数据库表将使用第一次提交创建,因为我在persistence.xml文件中设置了Schema Generation,您可以从文件中看到

    org.eclipse.persistence.jpa.PersistenceProvider de.professional_webworkx.crm.domain.Person          

所以我希望这可以帮助您创建项目。

帕特里克