PDA

View Full Version : سوال: یک سوال ساده در مورد یک مثال از javaphantom



maamiri
سه شنبه 03 دی 1387, 14:38 عصر
:لبخند:
به این لینک نگاه کنید
http://barnamenevis.org/forum/showthread.php?t=133450&page=2
حالا به این لینک نگاه کنید
http://ranjankumar.com/2008/10/21/ejb3-mapping-persistent-objects-example-2/
به قسمت client نگاه کنیدمنظورم کلاس client
میبینید چطور مقدار تزریق کرده به کلاس customer ..من هم تو مثال اول چه در مثال دوم نمی تونم از find استفاده کنم .. پس از انجام query مقدار NULL بر گشت داده میشه...دلیلش چیه؟
شما میتونید یه نگاهی بندازید؟:تشویق:
:افسرده:

javaphantom
سه شنبه 03 دی 1387, 17:09 عصر
کل کدت رو بزار تا بحت بگم کجا ایراد داره

maamiri
شنبه 07 دی 1387, 08:18 صبح
سلام به استاد عزیزم.
کل کد همون لینک سایت دومه که گذاشتم.
ممنون میشم که یه نگاهی بندازین..:قلب:

javaphantom
شنبه 07 دی 1387, 12:36 عصر
من کاری ندارم اون هندی عقب مونده چی کار کرده این کاری که من می گم بکنی حله. ولی بازم می گم کلی concept هست که باید بری خودت بخونی و جریانش رو در بیاری

طرف client. برای خودت یک project جدا درست کن توی NETBEANS یا هرجا که بلدی اصلا توی kate خوبه؟

package myclient;

import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import myejb.MySessionRemote;
import mypersistence.Person;

/**
*
* @author root
*/
public class Main {

private Properties prop;
private Context ctx;
private MySessionRemote sr;

public Main() {
}

private Context getContext() {
try {
if (this.ctx == null) {
prop = new Properties();
prop.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory");
prop.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");
prop.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFa ctoryImpl");
prop.setProperty("org.omg.CORBA.ORBInitialHost", "192.168.1.2");
prop.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
ctx = new InitialContext(prop);
}
} catch (Exception ex) {
ex.printStackTrace();
}
return ctx;
}

public void save() {
Person person = new Person();
person.setName("babak");
person.setFamily("azarmi");
try {
sr = (MySessionRemote) getContext().lookup("myejb.MySessionRemote");
sr.savePerson(person);
} catch (Exception ex) {
ex.printStackTrace();
}
}

public void show() {
try {
sr = (MySessionRemote) getContext().lookup("myejb.MySessionRemote");
Person p =sr.getPerson("babak");
System.out.println(p.getId());
System.out.println(p.getName());
System.out.println(p.getFamily());

} catch (Exception ex) {
ex.printStackTrace();
}

}

public static void main(String[] args) {
Main m = new Main();
m.save();
m.show();

}
}

به package ها هم دقت کن. نکته اساسی اینکه که باید در قسمت client توی classpath ی که داره حتما jar فایل ejbی که بعد می سازیم تعریف شده باشه . اینها رو فکر کنم که دیگه خودت استاد شدی.
اما در قسمت سروری.
نکته هایی که باید رعایت کنی یا من رعایت کردم و تو باید بدونی اینکه یک من از hibernate استفاده نه toplink. دوم اینکه تمام بار کنترل transaction ها رو روی container نزاشتم بلکه خودم handle کردم و تو توی کد خواهی دید. پس به قسمت persistence.xml خیلی دقت کن بابا که چه جوری تنظیم کردم. اون کتابی که بهت معرفی کردم اگر خونده باشی خواهی دید ما برای کنترل transaction ها هم می تونیم بندازیم گردن container که من موافقه این کار هستم درصد خطا می یاد پایین و هم می تونی خودت transaction ها رو باز وبسته کنی که اینجا من بهت گفتم اینطوری رفتار کردم که درکل این کار بهتره برای اینکه همه چیز دسته خودته. یک پروژه دیگه باز می کنی بعد کد ها رو اضافه می کنی. بعد jar فایل درست می کنی بعد jar فایل رو به classpath ی توی clientهست اضافه می کنی بعد deploy می کنی.
کلاس Person.java

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package mypersistence;

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

/**
*
* @author root
*/
@Entity
@Table(name = "test")
//@NamedQueries({@NamedQuery(name = "Test.findAll", query = "SELECT t FROM Test t")})
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Basic(optional = false)
@Column(name = "name")
private String name;
@Basic(optional = false)
@Column(name = "family")
private String family;

public Person() {
}

public Person(Integer id) {
this.id = id;
}

public Person(Integer id, String name, String family) {
this.id = id;
this.name = name;
this.family = family;
}

public Integer getId() {
return id;
}

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

public String getName() {
return name;
}

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

public String getFamily() {
return family;
}

public void setFamily(String family) {
this.family = family;
}

@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.Test[id=" + id + "]";
}

}

همانطور که می بینی من یک table دارم توی دیتا بیسم به نام test که اینجا map شده. یک id بیشتر ندارم.
نکته من از dataabase mysql استفاده کردم. نکته بعدی جدول نرمال هست ولی منطقی نیست و یعنی می بینی که می تونی n تا اسم تکراری بدی ولی در query زده شده فقط منتظر یک record هستی. خودت دقت کن. من کد table رو هم بهت می دم.
اما در قسمت session ها من فقط bean رو برات می فرسم خود برعکسش interface رو بساز دیگه. jar فایلهای hibernate رو هم netbeans داره به این projectet اضافه کن.

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package myejb;

import javax.ejb.Stateless;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import mypersistence.Person;

/**
*
* @author root
*/
@Stateless
public class MySessionBean implements MySessionRemote {

private EntityManagerFactory emf;
private EntityManager em;

private EntityManager getEM() {
if (emf == null || em == null) {
emf = Persistence.createEntityManagerFactory("test");
em = emf.createEntityManager();
}
return em;
}

public void savePerson(Person person) {
try {
getEM().getTransaction().begin();
//
getEM().persist(person);
//
getEM().getTransaction().commit();
} catch (Exception ex) {
if (getEM().getTransaction().isActive()) {
getEM().getTransaction().rollback();
}
ex.printStackTrace();
} finally {
try {
getEM().clear();
} catch (Exception e) {
e.printStackTrace();
}
}
}

public Person getPerson(String name) {
String q = "SELECT p FROM Person p WHERE p.name = :name";
Query query = null;
Person person = new Person();
try {
getEM().getTransaction().begin();
//
query = getEM().createQuery(q);
query.setParameter("name", name);
person = (Person) query.getSingleResult();
//
getEM().getTransaction().commit();


} catch (Exception ex) {
if (getEM().getTransaction().isActive()) {
getEM().getTransaction().rollback();
}
ex.printStackTrace();
} finally {
try {
getEM().clear();
} catch (Exception e) {
e.printStackTrace();
}
}
return person;
}

public void removePerson(String name) {
throw new UnsupportedOperationException("Not supported yet.");
}
}


بازم می گم به نام پروژه و package ها خوب دقت کن. اما قسمت آخر persistence.xml هست که چون من دستی دارم کنترل می کنم خوب نگاه کن ببین چی کار کردم.
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="test" >
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<!--<jta-data-source>test</jta-data-source>-->
<class>mypersistence.Person</class>
<properties>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.password" value="babak"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost/test"/>
<property name="hibernate.connection.username" value="root"/>
</properties>

</persistence-unit>
</persistence>


بقیشم گیر کردی بپرس منظورم توی اجراش نیست توی فهمشه

کد table

CREATE TABLE `test`.`test` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(200) NOT NULL,
`family` varchar(200) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=latin1

maamiri
شنبه 07 دی 1387, 13:29 عصر
:تشویق::تشویق::تشویق:
ممنونم که این همه باحوصله جوابمو دادی.من همین اول کار یه سوال برام پیش اومده اما اول خوب مطالعش میکنم بعد ازت میپرسمش.اما یه سوال دیگه هم دارم و اون اینه که از jql (نمیدونم این کلمه درسته یا نه ولی تو کتابی که معرفی کردی این کلمه و گاهی هم کلمه ejbql رو بجای sql یا همون زبان پرسو جوی شیی استفاده کرده) وقتی بصورت find all از entity class to database یک query میگیرممثل این select o from databasename as o درست جواب میده اما وقتی اینجوری مخوام طبق فرامین sql محدودش کنم مثلا با where خطا بر میگردونه...البته اینم بگم که طبق همون سیلاب کتاب عمل میکنم ...هر چی هم گشتم نتونستم یک کتاب مستقل از این به اصتلاح jql پیدا کنم که مفصل تر توضیح داده باشه..اگه یکم راهنماییم کنی یا یکم در مورد این مبحث بگی ممنون میشم:متفکر::افسرده:

javaphantom
شنبه 07 دی 1387, 14:37 عصر
:تشویق::تشویق::تشویق:
ممنونم که این همه باحوصله جوابمو دادی.من همین اول کار یه سوال برام پیش اومده اما اول خوب مطالعش میکنم بعد ازت میپرسمش.اما یه سوال دیگه هم دارم و اون اینه که از jql (نمیدونم این کلمه درسته یا نه ولی تو کتابی که معرفی کردی این کلمه و گاهی هم کلمه ejbql رو بجای sql یا همون زبان پرسو جوی شیی استفاده کرده) وقتی بصورت find all از entity class to database یک query میگیرممثل این select o from databasename as o درست جواب میده اما وقتی اینجوری مخوام طبق فرامین sql محدودش کنم مثلا با where خطا بر میگردونه...البته اینم بگم که طبق همون سیلاب کتاب عمل میکنم ...هر چی هم گشتم نتونستم یک کتاب مستقل از این به اصتلاح jql پیدا کنم که مفصل تر توضیح داده باشه..اگه یکم راهنماییم کنی یا یکم در مورد این مبحث بگی ممنون میشم:متفکر::افسرده:

وقتی داری با چند لایه بالاتر از jdbc کار می کنی دیگه SQL رو بریز دور. مفاهیم همونه ولی دیگه Structured نیست می شه Hibernate Query Language. می خواهی select بزنی روی جدول نمی زنی روی entity می زنی.
الان یک دونه Person هست که entity تو هست. میخوای select بزنی روی این Person بزن اون ور خوده provider ت که الان Hibernate هست درستش می کنه. بچم باهوشه. خوبی این کار اینکه که تو دیگه برات فرقی نداره که او پشت database تو oracle هست mysql هست یا هر مزخرفه دیگه تو بجای SQL اون بابا می یایی با providerت کار می کنی.

چرا که where کار نمی کنه. الا ن توی مثالی که برات فرستادم where زدم که کار می کنه مثل بنز. بعد منظورتو از find all نمی دونم چیه

maamiri
یک شنبه 08 دی 1387, 12:23 عصر
ممنون از توضیحاتت ...دارم روشون کار میکنم...به محض اینکه جواب بگیرم پیغام میزارم

maamiri
دوشنبه 09 دی 1387, 20:39 عصر
:گریه::قهقهه:
نه من هنوزم مشکل دارم.وقتی query میگیرم اینخطا بر میگرده
javax.ejb.EJBException: nested exception is: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.RemoteException: null; nested exception is:
java.lang.NullPointerException
یه مطلب دیگه هم میخواستم بگم
در netbeans6.5 یه گزینه جدید اضافه شده به اسم persistence
که توش این گزینه ها موجوده
entity classes from database
jpa controller classes from entity classes
persistence unit
session beans for entity classes
که تمام اون چیزهایی که شما گفتید رو میشه در یک سوت بدون یک خط کد زدن آماده کرد اما با این حال من با کد شما هم سرو کله زدم اما باز هم همون پیغام خطا صادر میشه
:عصبانی++:
میدونید..:متفکر:
وقتی یک queryکلی مثل این میگیرم select o from <databasename>as o مشکلی نیست و همه مقدار موجود در دیتابیس استخراج میشه اما وقتی یک query مثلا با این حالت میگیرم مقدارnull بر میگرده SELECT p FROM Person p WHERE p.name = :name
یا وقتی مقداری رو برای ذخیره کردن در دیتابیس به entity میفرستم خطای بالا که اول گفتم صادر میشه
شما فکر میکنید مشکل چیه؟

javaphantom
دوشنبه 09 دی 1387, 22:01 عصر
:گریه::قهقهه:
نه من هنوزم مشکل دارم.وقتی query میگیرم اینخطا بر میگرده
javax.ejb.EJBException: nested exception is: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.RemoteException: null; nested exception is:
java.lang.NullPointerException
یه مطلب دیگه هم میخواستم بگم
در netbeans6.5 یه گزینه جدید اضافه شده به اسم persistence
که توش این گزینه ها موجوده
entity classes from database
jpa controller classes from entity classes
persistence unit
session beans for entity classes
که تمام اون چیزهایی که شما گفتید رو میشه در یک سوت بدون یک خط کد زدن آماده کرد اما با این حال من با کد شما هم سرو کله زدم اما باز هم همون پیغام خطا صادر میشه
:عصبانی++:
میدونید..:متفکر:
وقتی یک queryکلی مثل این میگیرم select o from <databasename>as o مشکلی نیست و همه مقدار موجود در دیتابیس استخراج میشه اما وقتی یک query مثلا با این حالت میگیرم مقدارnull بر میگرده SELECT p FROM Person p WHERE p.name = :name
یا وقتی مقداری رو برای ذخیره کردن در دیتابیس به entity میفرستم خطای بالا که اول گفتم صادر میشه
شما فکر میکنید مشکل چیه؟

خطای ایجاد شده ربطی به entity نداره.چیزی که داره می گه ناله موقعی هست که داره remote می زنه و احتمالا موقعی که می خواد از entity شمارو مدیریت کنه یعنی برای ساختن EntityManager شما هست که توی حافظه پیدا نمی کنه و null بر می گردونه. اونجایی که می خواهید عمل persist انجام بدین مثلا بصورت زیر عمل کنید

if (em == null) {
System.out.println("null");}

می خوام مطمعن بشم اونجایی که شما context رو به entity دادید داستان رو فهمیده چی هست یا نه؟ ببنید در خروجی server اگر null چاپ کرد اون موقع بهتر می شه.
چرا کل کدتون روتوی این سایت نمی زاری تا ببینم چی کار کردی. مخصوصا persistence.xml فایلتون رو

maamiri
سه شنبه 10 دی 1387, 07:35 صبح
ممنون از توضیحاتت ...چشم...تا ظهر اگه تو شرکت اتفاق خواصی نیفته که وقتمو بگیره حتما میزارم سورس رو ...بازم ممنون استاد:بوس::تشویق:

javaphantom
سه شنبه 10 دی 1387, 08:07 صبح
ممنون از توضیحاتت ...چشم...تا ظهر اگه تو شرکت اتفاق خواصی نیفته که وقتمو بگیره حتما میزارم سورس رو ...بازم ممنون استاد:بوس::تشویق:

ببیند خواهش می کنم روی email من بفرس چون من تصمیم دارم توی این سایت دیگه چیزی ننویسم

maamiri
سه شنبه 10 دی 1387, 10:12 صبح
:متعجب::گریه::متفکر: چرا ؟مگه چی شده استاد...؟:عصبانی++::گریه:

maamiri
سه شنبه 10 دی 1387, 14:54 عصر
فایل رو ارسال کردم...لطفا یه نگاهی بندازید:افسرده: