将@PersistenceContext和EntityManager用于多个模式

时间:2014-09-15 08:23:26

标签: java maven jpa

我目前正致力于一个我想以最有效的方式构建的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的问题,并建议您提出另一个问题,详细说明我的项目。

如果我遗漏了任何内容,我很乐意添加更多详细信息,并感谢您的建议和帮助。

1 个答案:

答案 0 :(得分:3)

  

Q1)我应该为每个实体设ServiceServiceImpl吗?

不一定。根据持久性单元的名称:EmployeesDAO,我假设ServiceServiceImp旨在实现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 FactoryFactory methodSingleton),以便手动实例化/访问您的实体管理器

此外,如果您想使用Java SE开发应用程序的顶级层并使用容器管理的持久性,那么您可以使用JPA和Enterprise JavaBeans架构对持久层进行编码。这种方法并不简单,但有几个优点:

  • 您可以通过EJB模块将持久层提供为服务
  • EJB容器可以管理数据库连接和池。这对于将数据库连接信息与persistence.xml文件分开非常有用。
  • 如前所述,EJB容器将管理整个实体管理器生命周期。
  • 你可以更进一步,让容器使用Java Transaction API,这样你就可以忘记(或多或少)关于交易的东西。

其他评论

我知道发布的persistence.xml可能只是一个例子,但我必须提到连接数据库root用户根本不是一个好习惯。出于安全原因,您应该拥有几个具有访问数据库权限的用户,并且可能没有人会需要超级用户权限。

最后,应用程序设计是一个非常广泛的主题,它可以根据您的要求简单或复杂。此外,还有一些可以使用的框架/技术,如果您没有任何经验,很容易迷失。我的建议如果你之前从未做过这样的事情,那就是从一个非常基本的应用程序开始,然后再进一步。