# فناوری جاوا > برنامه‌نویسی جاوا > Java EE : نگارش سازمانی جاوا >  resultset در ejb

## maamiri

وقتی یک query از دیتابیس در ejbمیگیریم و میریزم تو resultset چرا نمیشه برگردوندش تو client ؟دلیلش چیه؟ :متفکر:

----------


## javaphantom

اگر منظورتون entity هستش
هنگامی که شما در سمت سرور session bean و entity bean ها رو deploy کردید باید یک jar فایل داشته باشید. این jar فایل رو باید در مسیر classpath در سمت client باشه. چون تمام entity bean های شما serialize هستند و در قسمت سرور هستند باید در قسمت client هم وجود داشته باشند که بتوان آنها desrialize کرد. در ضمن اگر از toplink یا hibernate استفاده می کنید حتما jar file های این دو را هر کدوم کا استفاده می کنید در دو قسمت باید وجود داشته باشد. یعنی در مسیر classpath هر دو

----------


## maamiri

فکر کنم منظورم رو متوجه نشدید
بببینید وقتی از سمت کلاینت یک درخواست query از دیتابیس میکنیم و ارسال میشه به ejb server همه چیز درسته و query گرفته میشه.من همیشه وقتی تحت application بصورت تک کاربره برنامه مینوشتم این query  رو میریختم تو resultset  و با حلقه while(rs.next) به محتواش دسترسی داشتم اما اینجا و قتی میخوام این resultset  رو برگردونم به کلاینت ‌ارور میده و نمیشه.میخوام بدونم اصلا ارسال این resultset تو ejb  امکان پذیره ؟
من تو ۳ یا ۴ کتاب دیدم که از collection برای ارسال استفاده شده..
والا من که گیج شدم... :گیج:  یک مثال میتونید برام لینک کنید؟ :لبخند گشاده!:

----------


## javaphantom

حوب معلومه دیگه چرا چون توی ejb شما از JDBC استفاده نمی کنید. شما از JPA و یک فریم فرک استفاده می کنید مانند hibernate  یا  toplink شما پس اصلا ejb کار نمی کنید.

منظورتون ازejb چی است؟ از چه web app استفاده می کنید.؟ معماری شما چی هست؟ بیشتر توضیح بدید.
JDBC چیه تو ejb؟

----------


## maamiri

والا من از روی کتاب j2ee انتشارات ناقوس دارم یاد میگیرم...اونجا از jdbc  استفاده کرده...remote bean  ها در ejb  و entity bean و نحوه دسترسی به mysql ..این jpa  میشه بدونم چیه...؟ :گیج:

----------


## javaphantom

> والا من از روی کتاب j2ee انتشارات ناقوس دارم یاد میگیرم...اونجا از jdbc  استفاده کرده...remote bean  ها در ejb  و entity bean و نحوه دسترسی به mysql ..این jpa  میشه بدونم چیه...؟


خوب اگر بیشتر می خواهید بدونید از گفته خودتون استفاده می کنم که صحبت از entity bean کرده اید. 

برای اینکه بیشتر متوجه منظور من بشید با این سوال شروع می کنم

تفاوت entity bean با session bean ها چیست؟

ejb container چیست؟

مدیرت entity چگونه صورت می گیرد.؟ و از چند طریق؟

انواع session bean?

interceptor ها؟

بحث jndi؟

این چیزهایی که گفتم تا الفبای کار هست که اگر هر کدوم رو درست فهمیدی یعنی واقعا فهمیدی بدون کدهم نزنی موفقی تا اینکه نفهمی و الکی کد بزنی. مثال هم می تونم برات بزنم ولی واقعا فکر می کنی بدرت بخوره با این تفاسیر؟

----------


## maamiri

ببین من jndi  و session رو میدونم چیه ..الان دارم تو application ازش استفاده میکنم.ولی یه شکل دیاگرام مانند برام لینک کن و توش بگو جای jpa و دیتابیس کجاست ..jdbc  کجا میره؟این مدیریت رو هنوز نفهمیدم.خوب دیگه زیاد به کتابای ایرانی نمیشه اعتماد کرد.زبان من هم زیاد خوب نیست که کتاب زبان اصلی بخونم.اگه یک شکل شماتیک برام لینک کنی تا جای هر کدوم رو بفهمم ممنون میشم :تشویق:

----------


## maamiri

الان معانی ‌اونایی رو هم که گفتی دیدم...همه رو میدونم چیه..لا اقل در تعریف....اما هنوز برام گنگه که چطور از jdbc استفاده نمی کنیم و بجاش از jpa استفاده میکنیم.
لطفا لپ مطلبو بدون هیچ طعنه ای برام بگو...

----------


## javaphantom

ببین عزیزه من jdbc همیشه هست. منتها از لحاظ معماری در پایین ترین سطح قرار داره. از طریق فریم ورکها که بصورت ORM هستنتد دست developer رو بازتر و  کا رو راحتر می کنند.

JPA یا java persistence API همون چیزی هست که شما به اون نیاز دارید. حالا اینکه JPA چیست و مفاهیم اون چیه شما باید از طریق کتاب حتما انگلیسی از من به شما نصحیت این کتابهای فارسی رو هیچ وقت نخونید چون کار رو بدتر خراب می کنند.
توی اینترنت جستچو کن. اما مثال. من الان سر کار هستم نمی تونم که براتون مثال بزنم ولی چشم شب براتون سعی می کنم یک چیزه کوچیک بفرسم. می توننم بصورت خوصوصی این کا رو کنم ولی حیف برای اولین بار توی این فروم یک بحث درست و حسابی مطرح شده شاید که بعضی ها استقبال کنند و پیشنهادات بهتری بدن در نتیجه تنها ریسک من می مونه طرز استفاده از امکانات این فرم که بتونم عکس بزارم و از این جور چیزها. ولی چشم. شما حتما بخون که مثال من و گفتهای من در مقابل یک خط کتاب مفت نمی ارزه. می خوام خودت مشکلات منو به من بگی.

----------


## mazdadoost

> وقتی یک query از دیتابیس در ejbمیگیریم و میریزم تو resultset چرا نمیشه برگردوندش تو client ؟دلیلش چیه؟


دوست عزیز:
میتونم بپرسم منظورتون از ejb چه نوع(Session-Entity-MD )و چه ورژنی هست؟یا شایدم jpa؟ دقت کنید که jpa یه داستان جدایه از Ejb ها داره!
و احتمال زیاد Entity باشه؟و چطور تو resultset میریزید؟کد رو میذارید؟راستش بنده تمام این تاپیک رو گشتم تا مشکل شما رو بفهمم ولی خیلی گنگه.اگه میشه کد رو بذارید یا لااقل به سوالایی که پرسیدم با دقت جواب بدین تا بتونم مشکل رو بفهمم.
موفق باشید.

----------


## maamiri

ببينم شما تا حالا از application مگه استفاده نكرديد؟خوب چطور يك application java رو به ديتابيس متصل ميكنيد؟از طريق jdbc .وقتي query ميگيريد ميريزيد داخل يك متغير resultset  بعد با 
while(rs.next) ورق ميزنيدش بعد هر جاشو كه خواستيد استخراج ميكنيد.
منم ريختم داخل همون و با  session ميفرستمش براي client اما موقع ارسال خطا ميده .
حالا چرا نميشه نميدونم.البته من هر متغيري رو از ديتابيس گرفتم و ارسال كردم اما اين يكي ارسال نميشه.اين جواب سوال آخري بود
شايدم بايد از jpa كه شما ميگيد استفاده كرد
بهر حال  من الان يك سرچي مي كنم ولي تا حالا كه چيزي نتونستم پيدا كنم.من كه هنوز از اين jpa سر در نياوردم
ببينم اگه ما با jpa  ميتونيم با ديتابيس كار كنيم ديگه نيازي به دستورات sql نيست؟

----------


## mazdadoost

دوست عزیز :
منظورتون از Sesion شی Session سرولت کانتینر هست یا Session Bean?
در هر دو صورت کلاینت خودش به شی دسترسی نداره !چون اصولا :
1-براوزر درکی از اشیاء جاوا نداره.
2-حتی اگر کلاینت شما یک آپلت یا یک برنامه مسقل جاوا باشه اصولا چه شی Seesion و چه یک Session Bean هر دو در JVM ی جدای JVM کلاینت و در JVM سمت سرور ایجاد میشند.و کلایت نمیتونه بهشون دسترسی داشته باشه فقط میتونه محتویات توشون رو بخونه و متد هاشون رو اجرا کنه!
3-در مورد Resultset اما داستان متفاوته.بر اساس اینکه درایور JDBC و خوده دیتابیستون از چه کرسری پشتبانی کنه و شما از چه کرسری استفاده کرده باشید Resultset سمت سرور یا مشتری داشته باشید.این جا به قول خودتون میتونید Query تون رو بریزید توی Result set و بفرستین برای کلایینت .که این همش یعنی JDBC !و ربطی به EJB نداره!
و اما EJb....در صورتی که از EJB دو استفاده میکنید Entity Bean ها میتونند اشیائتون رو در دیتا بیس ذخیره کنند.و در EJB 3 با JPA میتونید اشیاتون رو پایدار کنید .در هر دو صورت هم کار EJB کانتینر ترجمه اشیاء جاوا و روابطشون (ارثبری -کامپززیشن و غیره ) به سطر ها و ستون ها و روابط یک پایگاه داده RDBMS مثله MSSQL یا Postrage SQL هست.(با این وجود گاهی برای رسیدن به حداکثر کارایی جاههایی رو برای انجام دادن دستورات DML Sql باز گذاشتن.)در هر صورت شما دارید با EJB و JPA و کلا با persistence Layer سرو کله میزنید و نه JDBC!
در مورد سوالتون :ببينم شما تا حالا از application مگه استفاده نكرديد؟خوب چطور يك application java رو به ديتابيس متصل ميكنيد؟از طريق Jdbc
باید عرض کنم استفاده کردم.و راههای زیادی هست.(اینو عرض کردم که بدونبد یتونید رو چیز هایی که گفتم میتونید حساب کنبد).
امیدوارم مفید بوده باشه .
موفق باشید.

----------


## maamiri

منظور شما از بروزر  همين ie  يا  mozila است؟
ولي من كه گفتم دارم ejb  رو تحت application مينويسم  نه تحت jsp يا  servlet
در جواب سوالتون هم بايد بگم كه session bean منظورمه
بهر حال من از حرفاتون هيچيه هيچي نفهميدم.
تا مثال نزنيد من متوجه نمي شم.
بهتر نبود يك مثال ليك ميدادين؟
 :چشمک:

----------


## javaphantom

در سمت سرور یا همان ejb با فرض اینکه  دو table در قسمت database داریم که table A رابطه یک به چند با Table B دارد مثلا هر Person چند شماره تلفن دارد.

در قسمت database کدها بدین صورت هستند.
CREATE TABLE  `test`.`person` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(100) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

برای table  بعدی نیز 
CREATE TABLE  `test`.`telephone` (
  `id` int(11) NOT NULL auto_increment,
  `number` varchar(20) NOT NULL,
  `personid` int(11) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `new_fk_constraint` (`personid`),
  CONSTRAINT `new_fk_constraint` FOREIGN KEY (`personid`) REFERENCES `person` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1

در قسمت سرور و در ejb برای entity ها که دو تا هستند یعنی یکی Person و دیگری Telephone این گونه عمل می کنیم

package mypersistence;

import java.io.Serializable;
import java.util.Collection;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;

/**
 *
 * @author root
 */
@Entity
public class Person implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;
    
    private String name;
    
    @OneToMany(cascade=CascadeType.ALL,mappedBy="id",f  etch=FetchType.LAZY)
    private Collection<Telephone> telephoneCollection;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public Collection<Telephone> getTelephoneCollection() {
        return telephoneCollection;
    }

    public void setTelephoneCollection(Collection<Telephone> telephoneCollection) {
        this.telephoneCollection = telephoneCollection;
    }
    
    

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Person)) {
            return false;
        }
        Person other = (Person) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "mypersistence.Person[id=" + id + "]";
    }

}

package mypersistence;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

/**
 *
 * @author root
 */
@Entity
public class Telephone implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;
    
    private String number;
    @JoinColumn(name="personId",referencedColumnName="  personid",nullable=false)
    @ManyToOne()            
    private Person personId;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public Person getPersonId() {
        return personId;
    }

    public void setPersonId(Person personId) {
        this.personId = personId;
    }
    
    

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Telephone)) {
            return false;
        }
        Telephone other = (Telephone) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "mypersistence.Telephone[id=" + id + "]";
    }

}

اما در قسمت بعدی که حتما نیاز هست فایلی هست به نام persistence.xml که مدیریت کار entity ها از طریق واسطه گری این فایل صورت می گیره که سرور یا بهتر بگم  container بفهمه که چه کار باید بکنه یا  چه جوری مدیریت کنه این entityها رو

این هم فایل persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.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_1_0.xsd">
  <persistence-unit name="mytest" transaction-type="JTA">
    <jta-data-source>mytest</jta-data-source>
    <properties/>
  </persistence-unit>
</persistence>

اما قدم بعد سراغ session bean  ها می ریم و با فرض اینکه این session bean ها remote هستند شروع به کار می کنیم
در واقع کل   business ما اینجا شکل می گیره و با فرض اینکه از طرف client یک شماره تلفن ست می کنیم عمل می کنم.

package biz;

import javax.ejb.Remote;
import mypersistence.Person;

/**
 *
 * @author root
 */
@Remote
public interface MyBizRemote {
    public void save(Person person) throws Exception;
}

package biz;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceContextType;
import mypersistence.Person;

/**
 *
 * @author root
 */
@Stateless
public class MyBizBean implements MyBizRemote {

    @PersistenceContext(name="mytest",unitName="mytest  ",type=PersistenceContextType.TRANSACTION)
    private EntityManager entity;
    
    public void save(Person person) throws Exception {
        entity.persist(person);
    } 
}

با این عمل هروقت از هر طرف که کلایت محسوب بشه یک Person فرستاده بشه در قسمت  ‌‌business که همین کلاس آخری هست عمل ذخیره صورت می گیره. کل این داستان رو یک jar فایل درست می کنی و اون بعد در web application خودت deployمی کنی. بعد یک نسخه از jar فایل رو در classpath هر client می زاری و jndi و داستانه بقیش

نکته:
کلی نکته توی همه کارام هست که باید بشینی بخونی و در گیر بشی. خیلی کارت درست باشه ۶ تا ۸ ماه زمان می بره در غیر این صورت تا ۱ سال بیشترم می تونی درگیرش باشی. 
نا امید نمی کنمت با این حرف آخرم   فقط بخون
تا می تونی بخون تا زمان رو ۱۰۰ برابر کمتر کنی. 
نکته بعد: از کتاب فارسی فرار کن.

----------


## mazdadoost

دوست عزیز:
چنانچه واقعا در حال کار روی JEE هستید باید به راحتی پست من رودرک کنید.اما خوب شاید بنده بد توضیح دادم.با این وجود راستش با توجه به این اجملات فنی که میفرمایید :ولي من كه گفتم دارم ejb رو تحت application مينويسم نه تحت jsp يا servlet
در جواب سوالتون هم بايد بگم كه session bean منظورمه ! احتمالا باید همون 6 تا 8 ماه زمان رو صرف درک کد ها فوق تصور دوستمون javaphantom بفرمایید تا بلکه با مثال جواب سوالتون رو پیدا کنید.
(ببخشید که تلخو گزنده گفتم اما گاهی یه تکون واسه هممون چیزه بدی نیست.)

----------


## javaphantom

> دوست عزیز:
> چنانچه واقعا در حال کار روی JEE هستید باید به راحتی پست من رودرک کنید.اما خوب شاید بنده بد توضیح دادم.با این وجود راستش با توجه به این اجملات فنی که میفرمایید :ولي من كه گفتم دارم ejb رو تحت application مينويسم نه تحت jsp يا servlet
> در جواب سوالتون هم بايد بگم كه session bean منظورمه ! احتمالا باید همون 6 تا 8 ماه زمان رو صرف درک کد ها فوق تصور دوستمون javaphantom بفرمایید تا بلکه با مثال جواب سوالتون رو پیدا کنید.
> (ببخشید که تلخو گزنده گفتم اما گاهی یه تکون واسه هممون چیزه بدی نیست.)


az in asoon tar nemitoonestam mesal bezanam
be nazare man moshkel sar concept hast

----------


## maamiri

عزیز دلم همه اینارو تا حالا تو برنامه خودم استفاده کردم.اما اینکه چطور بدون درگیری با jdbc اطلاعات وارد دیتابیس میشه برام گنگه.باید دقیق مطالعش کنم.الان تو این کد ها jpa استفاده شده؟

----------


## maamiri

راستی یادم رفت تشکر کنم.هم وقت گذاشتی.هم اینکه هم من و هم خیلیهای دیگه مطلب جدیدی یاد گرفتن.خودت خوب میدونی که زبان ما ایرانی ها تعریفی نداره و کلاسای خوبی هم تو ایران نیست.به هر حال ممنون.فکر کنم بیشتر مطلب رو گرفتم با مطالعه اینا...حتما اگه مشکلی داشتم می پرسم ازتون. :بوس:

----------


## maamiri

:خیلی عصبانی: 
میشه بمن بگی توی  اینentity ها که نوشتی ازطریق کدوم خط به دیتابس و فیلدهاش دسترسی پیدا کردی...؟ای کاش اسم table ها و entity ها رو یکی نمی گرفتی..من قاطی کردم

----------


## javaphantom

> میشه بمن بگی توی  اینentity ها که نوشتی ازطریق کدوم خط به دیتابس و فیلدهاش دسترسی پیدا کردی...؟ای کاش اسم table ها و entity ها رو یکی نمی گرفتی..من قاطی کردم


یک لایه دیگری وجود داره که مدیریت transaction ها و connection ها رو برای ما مدیریت می کنه.
ببین دوست عزیز شما متاسفانه به دوست من آقای mazdadoost هم بصورت توهین آمیز بر خورد کردی که به من ربطی نداره ولی اگر کسی باشه توی این فروم که بتونه کمکت بکنه همین آقای mazdadoost هست. من جای شما بودم یک کاریش می کردم. من خودم به شخصه حوصله درس دادن و مثال زدن ندارم یعنی وقتش رو ندارم. من تنها کاری که می تونم برای شما و باقی دوستان بکنم اینکه وقتی متوجه بشم طرف خونه و مفهوم رو فهمیده ولی موقع implement کردن به مشکل بر خورده شاید شاید بتونم اونجا کمکش کنم. ولی واقعا شما می دونم که ناراحت می شید ولی بازم می گم بیشتر مطالعه کنید.

کلی مطلب در مورد jpa هست. در مورد orm هست و و و و و

----------


## javaphantom

> من هنوزم نمی فهمم...
> چرا کسانی که چیزی بلدن با تعنه و قیافه گرفتن مطلبی رو که کلیدیه میگن..از اول هم نیازی نبود شما آموزش بدین...من خواستم که سایتی رو برام لینک کنید که تمام این مطالبی رو که میگین بزارین...یا لا اقل اسم یک کتاب....
> این آموزش بقول شما ۲ زار نیرزید چون ناقص موند...فقط سر در گمی منو بیشتر کرد...شما از این لحاظ مدیون شدید به من نه من به شما...حالا هم نیازی نیست به به استلاح آموزش شما...خودم می گردم و یاد میگیرم...شاید طول بکشه اما ارزش  منت انسانها رو کشیدن رو نداره...ببخشد که به دوست 
> جون در جونیتون توحین شد آقا...
> -------------------------------------------------------------------------------------------------------------
> آلبرت انیشتن:۲ چیز نا متناهیه...قیافه گرفتن انسانها و آموزش مطلب jpa به وسیله شما...


من خیلی سرم شلوغ بود نیومدم توی سایت تا نوشتهات رو بخونم. برای من مهم نیست که چی در مورد من فکر می کنی اما 
کتاب خواستی برای download 
من این کتاب رو به شما پیشنهاد می کنم.

Pro EJB 3: Java Persistence API
در مورد  Hibernate هم هرچی کتاب پیدا کردید بد نیست
تو گوکل هم search کنید کلی مطلب هست در مورد JPA

----------


## maamiri

ببخشيد كه بد حرف زدم...ممنون از كمكهاتون.كتابي كه كفتيد دانلود كردم.دارم سرو كله يزنم باهاش
موفق و پيروز باشيد.

----------


## javaphantom

> ببخشيد كه بد حرف زدم...ممنون از كمكهاتون.كتابي كه كفتيد دانلود كردم.دارم سرو كله يزنم باهاش
> موفق و پيروز باشيد.


هرجا گیر کردی بازم پست بزار. حتما کمکت می کنم. ولی بشرطی که اول خوب بخونی. خودت سرو کله بزنی در آخر اینجا مطرح کنی. بازم می گم هوای mazdadoost رو داشته باش اونم یکی از choice های خوبه که بتونه کمکت کنه

----------

