Chào mọi người,
Hiện mình đang tìm hiểu về EJB 3.0; sử dụng JPA và Glassfish server.

Cái project mình đang viết sử dụng Netbean 7.1.2.
Mình có 1 Stand alone client (Winform = Java); mình muốn từ client này gọi remote interface của EJB Module đã được deploy trên Glassfish server bằng các xài mấy lệnh đại loại như:

Mã:
 Context ic = new InitialContext();

RemoteInterface rm = (RemoteInterface) ic.lookup("--path to interface");

//call business method return entities (use JPA)
rm.doBussiness();
Vấn đề ở chỗ trong netbean 7.1.2, khi tạo remote interface cho EJB module nó bắt interface ấy phải trong project khác --> mình coi ví dụ để trong 1 Java class library project.

Mình cũng tạo entity trong Java class library này bằng cách xài tool phát sinh tự động của Netbean.

File persistence.xml như sau:

Mã:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xmls/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xmls/persistence http://java.sun.com/xmls/persistence/persistence_2_0.xsd">
  <persistence-unit name="EJBRemoteLibPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>ejb.entity.Phieuthutien</class>
    <class>ejb.entity.Khachhang</class>
    <class>ejb.entity.Thamso</class>
    <class>ejb.entity.Hoadon</class>
    <class>ejb.entity.CtHoadon</class>
    <class>ejb.entity.Nguoidung</class>
    <class>ejb.entity.Phieunhapsach</class>
    <class>ejb.entity.Baocaocongno</class>
    <class>ejb.entity.CtPhieunhapsach</class>
    <class>ejb.entity.Sach</class>
    <class>ejb.entity.Baocaoton</class>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:sqlserver://localhost\SQLEXPRESS:1433;databaseName=QLNHASACH"/>
      <property name="javax.persistence.jdbc.password" value=""/>
      <property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
      <property name="javax.persistence.jdbc.user" value="sa"/>
    </properties>
  </persistence-unit>
</persistence>
Sau đó mình add java class library này vào ejb module và stand alone client project.

==> Mọi thứ đều ổn.

Tuy nhiên khi tạo ra một session bean trong EJB module như sau:


Mã:
 */
@Stateless
public class SachDAOBean implements SachDAOBeanRemote {

 private final static String UNIT_NAME = "EJBRemoteLibPU"; // tên này trùng với file persistence.xml //trong java class library
    @PersistenceContext(unitName = UNIT_NAME)
    protected EntityManager em;
   ....
}
Mình deploy xong thì ok.

Nhưng khi từ stand alone client gọi thực thi business method thì nó báo lỗi như sau:

Mã:
Caused by: java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName EJBRemoteLibPU
Tức là EJB module không nhận được persistence unit mặc dù tên mình xài đúng rồi

Mình không biết lỗi tại đâu hay do cấu hình file persistence bị sai hoặc để trong file jar của class library nó không nhận ra khi deploy.

Dưới đây là cấu trúc của các project:



Còn đây là các file (vật lý) của EJB module:



Thấy trong thư mục dist của EJB module, trong file jar (file build của module) thư mục META-INF ko có file persistence.xml ---> không biết đây có phải là lỗi nên nó mới không nhận ra persistence unit.

Mình mới bắt đầu tìm hiểu về EJB nên cũng không hiểu rõ nữa.

Mọi người cho mình hỏi:
+ Lỗi mình nêu ở trên là do đâu?
+ Nếu để các lớp entity (JPA) thì để ở đâu (EJB module hay để ở class library).

P/s: mình đang thử gọi phương thức từ EJB module = client java bình thường chứ ko phải từ web (nếu viết = template Java Enterprise Application --> web thì ví dụ trên mạng rất nhiều) nên rất mong mọi người có thể giúp đỡ dựa trên trường hợp cụ thể của mình.

Xin cảm ơn mọi người trước [IMG]images/smilies/biggrin.png[/IMG]