问题描述
我正在开发一个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(< NAME_OF_YOUR_PU>)。createEntityManager();
}
public Person saveOrUpdate(Person entity){
em.getTransaction()。begin();
T savedEntity = em.merge(entity);
em.getTransaction()。commit();
返回savedEntity;
}
public List< Person> getAllPersons(){
TypedQuery< Person> query = em.createNamedQuery(Person.GET_ALL,Person.class);
返回query.getResultList();
}
}
如果您只需要一个DataBroker实例,如果你需要一个实例池,创建一个池,你也许可以将它实现为Singleton。这是应用服务器的优点,他为你做这一切,你只需要注释你的类或成员。
我希望这可以帮到你。
编辑/更新
这里是EclipseLink 2.1的一个工作示例,但它只是持久性提供程序,所以它也可以用于Hibernate。
我创建了一个DataBroker,如上例所示实现我的IDataBroker接口并覆盖这些方法。
IDataBroker
$ b
import de.professional_webworkx.crm.domain.Person;
import java.util.List;
public interface IDateBroker {
public abstract void saveOrUpdate(Person person);
public abstract List< Person> 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< Patrick.Ott@professional-webworkx.de>
* @version 1.0
* /
public class DataBroker implements IDateBroker {
private EntityManager em;
public DataBroker(){
em = Persistence.createEntityManagerFactory(CRMPU)。createEntityManager();
$ b @Override
public void saveOrUpdate(Person person){
em.getTransaction()。begin();
em.merge(person);
em.getTransaction()。commit();
}
@Override
public List< Person> getAllPersons(){
抛出新的UnsupportedOperationException(还不支持。); //要更改生成方法的主体,请选择工具|模板。
}
@Override
public Person getPersonById(int id){
throw new UnsupportedOperationException(Not supported yet。); //要更改生成方法的主体,请选择工具|模板。
}
@Override
public Person getPersonByEmail(String email){
throw new UnsupportedOperationException(Not supported yet。); //要更改生成方法的主体,请选择工具|模板。
}
}
IPersonService接口
import de.professional_webworkx.crm.domain.Person;
import java.util.List;
public interface IPersonService {
void saveOrUpdate(Person person);
列表< Person> getAllPersons();
Person getPersonById(int id);
Person getPersonByEmail(String email);
}
PersonService
import de.professional_webworkx.crm.databroker.DataBroker;
导入de.professional_webworkx.crm.databroker.IDateBroker;
import de.professional_webworkx.crm.domain.Person;
import java.util.List;
公共类PersonService实现IPersonService {
私有IDateBroker代理;
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);
我们的Domain class Person
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实现Serializable {
private long id;
private String firstName;
private String lastName;
私人字符串电子邮件;
$ b $ public Person(){
}
public Person(String firstName,String lastName,String eMail){
this.firstName = firstName;
this.lastName = lastName;
this.eMail =电子邮件;
$ b @Id
@GeneratedValue(strategy = GenerationType.AUTO)
public long getId(){
return id;
}
public void setId(long id){
this.id = id;
$ b @Size(min = 2,max = 255,message =输入2到255个字符!)
@Column(name = firstname)
@NotNull
public String getFirstName(){
return firstName;
}
public void setFirstName(String firstName){
this.firstName = firstName;
$ b @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 class
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;
公共类FXMLController实现了可初始化{
私有IPersonService服务;
@FXML
私有标签标签;
@FXML
private void handleButtonAction(ActionEvent event){
Person p = new Person(Demo,User,demo@example.com);
service.saveOrUpdate(p);
$ b @Override
public void initialize(URL url,ResourceBundle rb){
//获取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 {
$ b $ @Override
public void start(Stage stage)throws Exception {
Parent root = FXMLLoader .load(的getClass()的getResource( / FXML / Scene.fxml)。);
场景场景=新场景(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);
}
}
这是一个标准的Maven JavaFX项目使用Netbeans 8创建。如果需要,我可以将源文件上传到GitHub或其他东西。
数据库表将在第一次提交时创建,因为我在persistence.xml文件,即可以从文件中看到的Schema Generation
<?xml version =1.0encoding = UTF-8 >?;
< persistence version =2.1xmlns =http://xmlns.jcp.org/xml/ns/persistencexmlns:xsi =http://www.w3.org/2001/XMLSchema-实例xsi:schemaLocation =http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd\">
< persistence-unit name =CRMPUtransaction-type =RESOURCE_LOCAL>
< provider> org.eclipse.persistence.jpa.PersistenceProvider< / provider>
< class> de.professional_webworkx.crm.domain.Person< / class>
<属性>
< property name =javax.persistence.jdbc.urlvalue =jdbc:mysql:// localhost:3306 / exampleDb?zeroDateTimeBehavior = convertToNull/>
< property name =javax.persistence.jdbc.uservalue =user/>
< property name =javax.persistence.jdbc.drivervalue =com.mysql.jdbc.Driver/>
< property name =javax.persistence.jdbc.passwordvalue =pass/>
< property name =javax.persistence.schema-generation.database.actionvalue =create/>
< / properties>
< / persistence-unit>
< /余辉>
所以我希望这可以帮助您创建您的项目。
Patrick
I'm developing a Java desktop application and was really interested in use JavaFX. I'm planning to use an MVC architecture because I have had some experience with Java EE and the MVC model.
I want to store data in a embedded derby database and use Hibernate as persistence layer but I can't find a great tutorial about implementing MVC with hibernate and JavaFX.
I have created the persistence file but I am not sure how to make it work with JavaFX. In Java EE I inject EJB services or DAOs but since my app is not server connected I think I can't do that.
Can someone explain me how to achieve that? It is possible to use them together?
解决方案In one of my last JavaFX Projects, i created under my Service Layer a DataBroker class, which could do all the CRUD Operations on the Database.
Example:
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(); } }
If you only need one DataBroker Instance, you maybe can realize it as a Singleton, if you need a Pool of Instances, create a Pool. This is the advantage of a Application Server, he does this all for you and you only have to annotate your Classes or Members.
I hope this will help you.
EDIT / UPDATEHere is a working example with EclipseLink 2.1, but it is only the Persistence Provider, so it works also with Hibernate.
I created a DataBroker like in the above example which implements my IDataBroker Interface and overrides the methods.
IDataBroker
import de.professional_webworkx.crm.domain.Person; import java.util.List; public interface IDateBroker { public abstract void saveOrUpdate(Person person); public abstract List<Person> getAllPersons(); public abstract Person getPersonById(int id); public abstract Person getPersonByEmail(String email); }
DataBroker - not every method is implemented...
import de.professional_webworkx.crm.domain.Person; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.Persistence; /** * * @author Patrick Ott <Patrick.Ott@professional-webworkx.de> * @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<Person> 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 Interface
import de.professional_webworkx.crm.domain.Person; import java.util.List; public interface IPersonService { void saveOrUpdate(Person person); List<Person> 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<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); } }
Our Domain class Person
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; } }
The FXMLController class
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(); } }
And last but not least the MainApp to start the Application.
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); } }
This is a standard Maven JavaFX Project created with Netbeans 8. If necessary i can upload the Sources to GitHub or something..
The Database Table will be created with the first commit, because i set up in the persistence.xml file, that Schema Generation as you can see from the file
<?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>
So i hope this will help you to create your project.
Patrick
这篇关于JavaFX + Hibernate(JPA)持久性+ Derby DB的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!