Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Работа с EJB


Автор: Sequd 4.5.2011, 16:08
Собственно я много читал, но так и не понял... как объединить Session Bean и Entity Bean

Кто из них должен иметь доступ к БД? 
ведь схема должна быть такая Servlet -> Session Bean -> Entity Bean -> БД
Но не могу все это совместить вместе. есть ли примеры как все это реализовано вместе?

Автор: MisterCleric 4.5.2011, 16:26
http://www.google.com/search?q=JPA

Автор: Sequd 4.5.2011, 17:19
Цитата(MisterCleric @ 4.5.2011,  16:26)
http://www.google.com/search?q=JPA

эмм, к чему это?) я разве говорил по JSP?
мне нужно что бы все начиналось с сервлета, но как продолжить связку дальше? 
где образуется подключение и запросы в БД?
мне хотелось бы посмотреть на реальный, но простой код... 

Автор: MisterCleric 4.5.2011, 17:34
эмм, к чему это?) я разве говорил по JSP?

Автор: Sequd 4.5.2011, 19:25
Цитата(MisterCleric @ 4.5.2011,  17:34)
эмм, к чему это?) я разве говорил по JSP?

извеняюсь, мой косяк, показалось что там JSP
да и отмазываться ссылками на гугл уже не прилично
искать там то, не зная что не особо увлекательно. 
Цитата

есть ли примеры как все это реализовано вместе?

Автор: RageSteel 4.5.2011, 19:43
Всё очень просто. Сервлет обращается к EJB, который обращается к EntityManager'у, которые обращается к базе данных и возвращает строки в таблицах в виде Entity-объектов.

Ниже пример для Java EE6.

Сам сервлет:
Код

package ru.vingrad.forum.java.ee;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Наш сервлет.
 * 
 * @author Rage Steel
 */
@WebServlet(name = "SampleServlet", urlPatterns = {"/SampleServlet"})
public class SampleServlet extends HttpServlet {

    @EJB
    private SampleEjb sampleEjb;
    
    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet SampleServlet</title>");  
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Customer list</h1>");
            List<Customer> customers = sampleEjb.getCustomers();
            out.println("<ul>");
            for (Customer customer : customers) {
                out.println("<li>");
                out.println(customer.getName());
                out.println("</li>");
            }
            out.println("<ul>");
            out.println("</body>");
            out.println("</html>");
        } finally {            
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}



EJB-bean:
Код

package ru.vingrad.forum.java.ee;

import java.util.List;
import javax.ejb.Stateless;
import javax.ejb.LocalBean;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;

/**
 *
 * @author Rage Steel
 */
@Stateless
@LocalBean
public class SampleEjb {
    
    @PersistenceContext
    private EntityManager entityManager;

    /**
     * Вернуть список Customer'ов.
     * 
     * @return 
     */
    public List<Customer> getCustomers() {
        TypedQuery<Customer> query = 
                entityManager.createQuery("SELECT c FROM Customer c", Customer.class);
        return query.getResultList();
    }
    
}


Entity-класс
Код

package ru.vingrad.forum.java.ee;

import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 * Класс сущности — представление строки из таблицы.
 * 
 * @author Rage Steel
 */
@Entity
@Table(name = "CUSTOMER")
public class Customer implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "CUSTOMER_ID")
    private Integer customerId;
    @Basic(optional = false)
    @Column(name = "ZIP")
    private String zip;
    @Column(name = "NAME")
    private String name;
    @Column(name = "ADDRESSLINE1")
    private String addressline1;
    @Column(name = "ADDRESSLINE2")
    private String addressline2;
    @Column(name = "CITY")
    private String city;
    @Column(name = "STATE")
    private String state;
    @Column(name = "PHONE")
    private String phone;
    @Column(name = "FAX")
    private String fax;
    @Column(name = "EMAIL")
    private String email;
    @Column(name = "CREDIT_LIMIT")
    private Integer creditLimit;

    public Customer() {
    }

    public Customer(Integer customerId) {
        this.customerId = customerId;
    }

    public Customer(Integer customerId, String zip) {
        this.customerId = customerId;
        this.zip = zip;
    }

    public Integer getCustomerId() {
        return customerId;
    }

    public void setCustomerId(Integer customerId) {
        this.customerId = customerId;
    }

    public String getZip() {
        return zip;
    }

    public void setZip(String zip) {
        this.zip = zip;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddressline1() {
        return addressline1;
    }

    public void setAddressline1(String addressline1) {
        this.addressline1 = addressline1;
    }

    public String getAddressline2() {
        return addressline2;
    }

    public void setAddressline2(String addressline2) {
        this.addressline2 = addressline2;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getFax() {
        return fax;
    }

    public void setFax(String fax) {
        this.fax = fax;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Integer getCreditLimit() {
        return creditLimit;
    }

    public void setCreditLimit(Integer creditLimit) {
        this.creditLimit = creditLimit;
    }

}


И persistence.xml — конфигурация для EntityManager'а:
Код

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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">
    <persistence-unit name="ServletPlusEjb" transaction-type="JTA">
        <jta-data-source>jdbc/sample</jta-data-source>
        <properties/>
    </persistence-unit>
</persistence>


Собственно пример для JavaEE6, проверялся в Glassfish 3.1. 

Автор: Sequd 5.5.2011, 13:23
Спасибо, это уже гораздо лучше.
У меня возникло 2 проблемы, не работают эти аннотации, к примеру эти @Stateless, @LocalBean, но тут смысел более менее понятен.
а вот строчка 
Цитата

TypedQuery<Customer> query = 
                entityManager.createQuery("SELECT c FROM Customer c", Customer.class);

совсем не понятна ((( 
можете по подробнее объяснить, что это за чудо EntityManager, почему он содержит запрос и вообще структуру??? (Запросы подобно этому должны быть здесь???)
а если я буду делать поиск по каким то критериям??? я так понимаю мне нужно будет написать еще 1 метод в SampleEjb??? но что должно быть там???

простите если вопросы очень глупые, но очень нужны помощь!

Автор: RageSteel 5.5.2011, 19:40
Цитата(Sequd @ 5.5.2011,  11:23)
а вот строчка 
Цитата

TypedQuery<Customer> query = 
                entityManager.createQuery("SELECT c FROM Customer c", Customer.class);

совсем не понятна ((( 
можете по подробнее объяснить, что это за чудо EntityManager, почему он содержит запрос и вообще структуру??? (Запросы подобно этому должны быть здесь???)
а если я буду делать поиск по каким то критериям??? я так понимаю мне нужно будет написать еще 1 метод в SampleEjb??? но что должно быть там???

простите если вопросы очень глупые, но очень нужны помощь!

EntityManager — это тот парень, который общается с базой. Чтобы всё понять — лучше погрузиться в описание Java Persistence API, частью которого он является. Он отображает строки таблиц в объекты, которые аннотированны как @Entity.

Если делать поиск — то в запрос нужно включать параметры, которые потом нужно устанавливать.

Собственно разумно всю работу с EntityManager оставить EJB-бинам. А уж сколько там будет методов — это уж как удобней.

Автор: Sequd 6.5.2011, 12:37
дело в том что у меня не работают эти аннотации!
Можете показать как сделать тоже самое только без аннотаций? Ведь это нужно что бы еще были и интерфейсы?

Автор: RageSteel 6.5.2011, 19:17
А ты на каком сервере разворачиваешь приложение? Чтобы аннотации работали, нужно что-нибудь JavaEE6-совместимое: Glassfish 3.x, JBoss 6…

Автор: Sequd 6.5.2011, 19:28
jboss-4.0.5.GA

но лучше увидеть все без них, что бы разобраться как все работает, ведь серверы разные могут быть

Автор: RageSteel 6.5.2011, 21:09
Jboss 4 — это Java EE 1.4, конечно там аннотации не работают, ибо их в четвёртой java не было. В мире Java EE 1.4 нужно писать много-много XML'я и дополнительных классов/интерфейсов. Я с этим не работал, так что увы.

Автор: Sequd 8.5.2011, 15:19
Кто поможет разобраться с 1.4? ооочень нужно и быстро!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)