我目前正致力于一个我想以最有效的方式构建的JavaSE项目。我的项目是一个employeeManagementSystem,它有几个模式。例如,我有一个名为employees
的模式,其中包含员工数据,另一个名为company
的模式包含公司数据。
目前,我已经实施了我的实体并使用hibernate.cfg.xml
对其进行了测试,以确保它们得到正确实施。例如,员工模式中的一个这样的实体是
@Entity
@Table(name="employees", uniqueConstraints= {
@UniqueConstraint(columnNames="idEmployees"),
@UniqueConstraint(columnNames="idCardNumber"),
@UniqueConstraint(columnNames="niNumber")
})
public class Employee {
@Id
@GeneratedValue
@Column(unique=true, nullable=false, updatable=false)
private int idEmployees;
@Column(unique=true, nullable=false, updatable=false)
@Size(min=1, max=15)
private String idCardNumber;
@Column(unique=true, nullable=false, updatable=false)
@Size(min=1, max=15)
private String niNumber;
@Column(nullable=false, updatable=false)
@Size(min=1, max=20)
private String name;
@Column(nullable=false)
@Size(min=1, max=20)
private String surname;
// Other class variables
//Constructors
//getters & setters
}
我现在正尝试使用EntityManager
来管理我的架构。我的员工架构的persistence.xml是
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="EmployeesDAO" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>com.shopmanagementsystem.employeesdao.entities.Employee</class>
//Other classes in this schema
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="root"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/employees"/>
</properties>
</persistence-unit>
</persistence>
我想创建一个Service和ServiceImpl类来管理与实体相关的进程。
Q1)我是否应该为每个实体提供服务和ServiceImpl?
我的一些问题已在之前的帖子JPA EntityManager Construction
中得到了回答 Q2)我进一步询问了使用@PersistenceContext
的问题,并建议您提出另一个问题,详细说明我的项目。
如果我遗漏了任何内容,我很乐意添加更多详细信息,并感谢您的建议和帮助。
答案 0 :(得分:3)
Q1)我应该为每个实体设
Service
和ServiceImpl
吗?
不一定。根据持久性单元的名称:EmployeesDAO
,我假设Service
和ServiceImp
旨在实现DAO pattern,对吧?在这种情况下,您必须为实际需要它的实体提供合同(INSERT / UPDATE / DELETE / QUERY)。例如,您可以拥有一个名为Category
的表,该表与Employee
的关系如下:
@Entity
@Table(name="categories")
public class Category implements Serializable {
...
@Id private BigInteger idCategory;
@Basic private String description;
...
}
@Entity
@Table(name="employees")
public class Employee implements Serializable {
...
@ManyToOne
@JoinColumn(name="idcategory", referencedColumnName="idcategory")
private Category category;
...
}
在此示例中,只有在您需要时才会有Service
来管理Category
个实体。如果这些实体由另一个应用程序管理,那么您只需要在categories
表上具有读权限,这样实体管理器就可以映射这些数据,就是这样。
Q2)我进一步询问有关使用@PersistenceContext的问题,并建议您提出另一个更详细描述我的问题 项目的
首先请注意,@PersistenceContext注释旨在与基于容器的持久性一起使用,作为Java EE应用程序的一部分。您不能在普通Java SE平台中使用此批注。
另一方面,这并不意味着你不能使用JPA。是的,这是完全可能的,但你必须照顾整个实体经理的生命周期。在这种情况下,通常的做法是实现设计模式(例如Abstract Factory或Factory method或Singleton),以便手动实例化/访问您的实体管理器
此外,如果您想使用Java SE开发应用程序的顶级层并使用容器管理的持久性,那么您可以使用JPA和Enterprise JavaBeans架构对持久层进行编码。这种方法并不简单,但有几个优点:
persistence.xml
文件分开非常有用。我知道发布的persistence.xml
可能只是一个例子,但我必须提到连接数据库root
用户根本不是一个好习惯。出于安全原因,您应该拥有几个具有访问数据库权限的用户,并且可能没有人会需要超级用户权限。
最后,应用程序设计是一个非常广泛的主题,它可以根据您的要求简单或复杂。此外,还有一些可以使用的框架/技术,如果您没有任何经验,很容易迷失。我的建议如果你之前从未做过这样的事情,那就是从一个非常基本的应用程序开始,然后再进一步。