JavaFX+;Hibernate(JPA)持久化&x2B;德比数据库

JavaFX+;Hibernate(JPA)持久化&x2B;德比数据库,java,hibernate,model-view-controller,javafx,derby,Java,Hibernate,Model View Controller,Javafx,Derby,我正在开发一个Java桌面应用程序,对使用JavaFX非常感兴趣。我计划使用MVC架构,因为我对JavaEE和MVC模型有一些经验 我想将数据存储在嵌入式derby数据库中,并使用Hibernate作为持久层,但我找不到关于使用Hibernate和JavaFX实现MVC的好教程 我已经创建了持久性文件,但我不知道如何使它与JavaFX一起工作。在JavaEE中,我注入了EJB服务或DAO,但由于我的应用程序没有连接到服务器,我想我不能这样做 有人能告诉我如何做到这一点吗?可以同时使用它们吗?在我

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

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

我已经创建了持久性文件,但我不知道如何使它与JavaFX一起工作。在JavaEE中,我注入了EJB服务或DAO,但由于我的应用程序没有连接到服务器,我想我不能这样做


有人能告诉我如何做到这一点吗?可以同时使用它们吗?

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

例如:

public class DataBroker {

    private EntityManager em;

    public DataBroker() {
        init();
    }

    private void init() {
        this.em = Persistence.createEntityManagerFactory("<NAME_OF_YOUR_PU>").createEntityManager();
    }

    public Person saveOrUpdate(Person entity) {
        em.getTransaction().begin();
        T savedEntity = em.merge(entity);
        em.getTransaction().commit();
        return savedEntity;
    }

    public List<Person> getAllPersons() {
        TypedQuery<Person> query = em.createNamedQuery(Person.GET_ALL, Person.class);
        return query.getResultList();
    }

}
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文件中设置了模式生成,您可以从该文件中看到

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="CRMPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>de.professional_webworkx.crm.domain.Person</class>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/exampleDb?zeroDateTimeBehavior=convertToNull"/>
      <property name="javax.persistence.jdbc.user" value="user"/>
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
      <property name="javax.persistence.jdbc.password" value="pass"/>
      <property name="javax.persistence.schema-generation.database.action" value="create"/>
    </properties>
  </persistence-unit>
</persistence>

org.eclipse.persistence.jpa.PersistenceProvider
de.professional\u webworkx.crm.domain.Person
所以我希望这将有助于你创建你的项目


帕特里克

谢谢你,但我已经有类似的东西了。我需要关于如何在JavaFX控制器上使用它的帮助。你有一个样本项目或教程吗?@Xavierñauñay我更新了我的答案,希望对你有所帮助!谢谢你的代码示例,这将对我有很大帮助。您已经澄清了您的疑问,现在是编写代码的时候了:)@Patrick我发现了许多将服务层用于MVC模式的示例,但我仍然对服务接口感到困惑,如果我们的模型共享相同的操作,那么我们可以为多个服务模型类实现相同的接口吗?第二件事,我们可以在控制器外面创建共享实例,我的意思是在其他类中,使控制器独立于模型数据吗?
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<Person> 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;
    }


}
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();

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

}
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="CRMPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>de.professional_webworkx.crm.domain.Person</class>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/exampleDb?zeroDateTimeBehavior=convertToNull"/>
      <property name="javax.persistence.jdbc.user" value="user"/>
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
      <property name="javax.persistence.jdbc.password" value="pass"/>
      <property name="javax.persistence.schema-generation.database.action" value="create"/>
    </properties>
  </persistence-unit>
</persistence>