Project : SimpleEJB
persistence.xml
mysql.ds
SimpleSettings.java /* энэ жишээнд шаардлагатай байгаа зарит нэг тогтмолууд */
package com.mdb.simple.settings;
/**
* @author Byambasuren.MD
*/
public class SimpleSettings {
public static String SAVE_PERSIST = "PERSIST";
public static String SAVE_MERGE = "MERGE";
public static String SAVE_REMOVE = "REMOVE";
public static String SAVE_REFRESH = "REFRESH";
public static String SAVE_NONE = "NONE";
public static Integer PAGER_OFFSET = 0;
public static Integer PAGER_LIMIT = 20;
public static String PAGER_ACTION_NONE = "none";
public static String PAGER_ACTION_FIRST = "first";
public static String PAGER_ACTION_PREVIOS = "previos";
public static String PAGER_ACTION_NEXT = "next";
public static String PAGER_ACTION_LAST = "last";
public static String RESULTS_VIEW_GRID = "GRID";
public static String RESULTS_VIEW_LIST = "LIST";
}
SimpleCacher.java /* зарим нэг бичлэгүүдийг байнга qurey - дээд байхгүйн тулд санах ойд байршуулбал performance - д сайн юм уу л гэж, заавал датабээс байх шаардлагагүй XML ч байсан болно, бие кодыг нь юу cache лахаасаа хамааруулаад өөрчилөөрэй */
package com.mdb.simple.cache;
/**
* @author Byambasuren.MD
*/
public class SimpleCacher {
private static SimpleCacher instance;
public static void Instance() {
instance = new SimpleCacher();
}
public static SimpleCacher getInstance() {
return instance != null ? instance : (instance = new SimpleCacher());
}
}
PagerDTO.java /* ViewHelper. энэ паттерн нь ejb 3.0 болон JSF framework - д зохимжгүй. баазаас авах бичлэгүүдийг хуудаслах зорилготой. Шууд jsf дээрээс дүрэмүүдийг нь дуудаад дуудаад ... */
package com.mdb.simple.dto;
import com.mdb.simple.settings.SimpleSettings;
/**
* @author Byambasuren.MD
*/
public class PagerDTO {
protected Integer offset;
protected Integer limit;
private Integer currPage, pageSize, resultSize = 0;
private String actionPage;
private String ordr;
private boolean sfirst = false, sprevios = false, snext = false, slast = false;
public PagerDTO() {
super();
this.actionPage = SimpleSettings.PAGER_ACTION_NONE;
this.currPage = 1;
this.pageSize = 0;
}
public PagerDTO(Integer offset, Integer limit) {
this.offset = offset;
this.limit = limit;
this.actionPage = SimpleSettings.PAGER_ACTION_NONE;
this.currPage = 1;
this.pageSize = 0;
}
/* actions */
public void dosetResultSize(Integer size) {
this.resultSize = size;
this.pageSize = this.resultSize / this.getLimit();
this.pageSize = this.pageSize + ((this.resultSize % this.getLimit()) > 0 ? 1 : 0);
this.first();
}
public void dosetPageAction() {
if (this.actionPage.equals(SimpleSettings.PAGER_ACTION_FIRST)) {
this.first();
} else if (this.actionPage.equals(SimpleSettings.PAGER_ACTION_PREVIOS)) {
this.previos();
} else if (this.actionPage.equals(SimpleSettings.PAGER_ACTION_NEXT)) {
this.next();
} else if (this.actionPage.equals(SimpleSettings.PAGER_ACTION_LAST)) {
this.last();
}
}
public void next() {
this.currPage = this.currPage + 1;
if (this.currPage == this.pageSize) {
this.last();
return;
}
this.sfirst = true;
this.sprevios = true;
this.setOffset((this.currPage - 1) * this.limit);
}
public void previos() {
this.currPage = this.currPage - 1;
if (this.currPage == 1) {
this.first();
return;
}
this.snext = true;
this.slast = true;
this.setOffset((this.currPage - 1) * this.limit);
}
public void first() {
this.currPage = 1;
this.sfirst = false;
this.sprevios = false;
this.snext = false;
this.slast = false;
if (this.pageSize > 1) {
this.snext = true;
this.slast = true;
}
this.setOffset((this.currPage - 1) * this.limit);
}
public void last() {
this.currPage = this.pageSize;
this.sfirst = false;
this.sprevios = false;
this.snext = false;
this.slast = false;
if (this.pageSize > 1) {
this.sfirst = true;
this.sprevios = true;
}
this.setOffset((this.currPage - 1) * this.limit);
}
/* */
public boolean getIsResults() {
return this.resultSize > 0 ? true : false;
}
/* getters setters */
public String getActionPage() {
return actionPage;
}
public void setActionPage(String actionPage) {
this.actionPage = actionPage;
}
public Integer getCurrPage() {
return currPage;
}
public Integer getPageSize() {
return pageSize;
}
public String getOrdr() {
return ordr;
}
public void setOrdr(String ordr) {
this.ordr = ordr;
}
public boolean isSfirst() {
return sfirst;
}
public boolean isSprevios() {
return sprevios;
}
public boolean isSnext() {
return snext;
}
public boolean isSlast() {
return slast;
}
public Integer getLimit() {
return limit;
}
public void setLimit(Integer limit) {
this.limit = limit;
}
public Integer getOffset() {
return offset;
}
public void setOffset(Integer offset) {
this.offset = offset;
}
}
SimpleEntity.java /* Entity bean. Entity bean - аа Value Object болгож ашиглах гэж байгаа бол Entity bean дээр олон юм бичих хэрэггүй. Уул нь @NamedQuery ашиглавал performance - д сайн гэдэг юм байна лээ. Миний хувьд бодож байгаад VO шинээр үүсгэхгүйгээр шийдсэн */
package com.mdb.simple.entity;
import java.util.Date;
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 Byambasuren.MD
*/
@Entity
@Table(name = "simple_simple")
public class SimpleEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(length = 200)
private String name;
@Column(length = 2000)
private String value;
private Date regDate;
public SimpleEntity() {
this.regDate = new Date();
}
/* managed getters setters */
public String getMDate() {
/* code */
return "";
}
/* getters setters */
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 String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public Date getRegDate() {
return regDate;
}
public void setRegDate(Date regDate) {
this.regDate = regDate;
}
}
SimpleRService.java
package com.mdb.simple.business.service;
import java.util.Collection;
import javax.ejb.Local;
import com.mdb.simple.dto.PagerDTO;
import com.mdb.simple.entity.SimpleEntity;
/**
* @author Byambasuren.MD
*/
@Local
public interface SimpleRService {
public final static String JNDI = "SimpleRService";
public Collection
public SimpleEntity getSimple(Long id);
}
SimpleService.java
/* интерфейс класс. би дүр эсвэл царай ч гэж нэрлэдэг. Бизнэс үйлдлүүдийн дүр(царай) */ миний хувьд үйлдүүдийг read only болон writable гэж 2 ангилаад 2 өөр session bean - дээр бичдэг болсон. яагаад вэ гэвэл зөндөө шалтгаан байгаа. хамгийн гол нь юу вэ гэвэл performance болон найдвартай ажиллагааг сайжруулахын тулд. ReadOnly үйлдлүүдийг CMP. Writable үйлдлүүдийг BMP. Хүмүүс гайхаж магадгүй BMP ашиглачаад юуных нь найдвартай гэж. гэхдээ BMP алдаа гарах магадлал өндөр ч тэр нь делелопероос л хамаарна. хийж чадвал гүйцэтгэл маш сайн. Мөн readonly үйлдлүүдийг EJB Container - аас гадна програмчилахыг оролдов. энэ жишээн дээр ч гэсэн алдаа байгаа. session.settimeout() - ийг оруулаагүй байна.
Performance - ийн талаар http://java.sun.com/developer/technicalArticles/ebeans/ejb_30/ - аас сайн үзнэ үү
package com.mdb.simple.business.service;
import javax.ejb.Local;
import com.mdb.simple.business.exception.BusinessException;
import com.mdb.simple.entity.SimpleEntity;
/**
* @author Byambasuren.MD
*/
@Local
public interface SimpleService {
public final static String JNDI = "SimpleService";
public SimpleEntity saveMember(SimpleEntity member, String smode) throws BusinessException;
}
SimpleRServiceImpl.java
package com.mdb.simple.business.service.impl;
import java.util.Collection;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;
import com.mdb.simple.business.service.SimpleRService;
import com.mdb.simple.business.service.SimpleService;
import com.mdb.simple.dto.PagerDTO;
import com.mdb.simple.entity.SimpleEntity;
import com.mdb.simple.util.log.Logger;
/**
* @author Byambasuren.MD
*/
@Stateless(name = SimpleRService.JNDI)
public class SimpleRServiceImpl implements SimpleRService {
@PersistenceUnit(unitName = "simplePU")
private EntityManagerFactory emf;
@PostConstruct
public void init() {
Logger.log("[MD][" + SimpleService.JNDI + "][INITIALIZING]");
}
@PreDestroy
public void destroy() {
System.out.println("[MD][" + SimpleService.JNDI + "][DESTROYING]");
}
@SuppressWarnings("unchecked")
public Collection
EntityManager em = this.emf.createEntityManager();
Query qr = em.createQuery("FROM SimpleEntity AS A ORDER BY " + (pager != null ? pager.getOrdr() : "regDate"));
if (pager != null) {
qr.setFirstResult(pager.getOffset());
qr.setMaxResults(pager.getLimit());
}
Collection
em.close();
return results;
}
public SimpleEntity getSimple(Long id) {
EntityManager em = this.emf.createEntityManager();
SimpleEntity result = em.find(SimpleEntity.class, id);
em.close();
return result;
}
}
SimpleServiceImpl .java
package com.mdb.simple.business.service.impl;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import javax.transaction.UserTransaction;
import com.mdb.simple.business.exception.BusinessException;
import com.mdb.simple.business.service.SimpleService;
import com.mdb.simple.entity.SimpleEntity;
import com.mdb.simple.settings.SimpleSettings;
import com.mdb.simple.util.log.Logger;
/**
* @author Byambasuren.MD
*/
@Stateless(name = SimpleService.JNDI)
@TransactionManagement(TransactionManagementType.BEAN)
public class SimpleServiceImpl implements SimpleService {
@PersistenceUnit(unitName = "simplePU")
private EntityManagerFactory emf;
@Resource
UserTransaction userTx;
@PostConstruct
public void init() {
Logger.log("[MD][" + SimpleService.JNDI + "][INITIALIZING]");
}
@PreDestroy
public void destroy() {
System.out.println("[MD][" + SimpleService.JNDI + "][DESTROYING]");
}
public SimpleEntity saveMember(SimpleEntity member, String smode) throws BusinessException {
EntityManager em = emf.createEntityManager();
try {
this.userTx.begin();
em.joinTransaction();
if (smode.equals(SimpleSettings.SAVE_PERSIST)) {
//em.merge(object); / * ЭНД ХЭД ХЭДЭН ДАРААЛСАН ҮЙЛДЛҮҮД БАЙЖ БОЛНО */
em.persist(member);
} else if (smode.equals(SimpleSettings.SAVE_MERGE))
em.merge(member);
else if (smode.equals(SimpleSettings.SAVE_REMOVE))
em.remove(member);
else if (smode.equals(SimpleSettings.SAVE_REFRESH))
em.refresh(member);
this.userTx.commit();
} catch (Exception exc) {
Logger.log("[AIAX][" + SimpleService.JNDI + "][ERROR][UNSUCCESSFUL. " + smode + " MEMBER]");
try {
this.userTx.rollback();
} catch (Exception e) {
Logger.log("[MD][" + SimpleService.JNDI + "][ERROR][UNSUCCESSFUL. ROLLBACK USERTRANSACTION]");
}
throw new BusinessException(exc.getMessage());
} finally {
em.close();
}
return member;
}
}
/* SERVICELOCATOR - ийн талаар далайгийн блогоос сайн ойлгосон байх. */
ServiceLocator.java
package com.mdb.simple.util.servicelocator;
import java.util.Hashtable;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import com.mdb.simple.util.servicelocator.exception.ServiceLocatorException;
/**
* @author Byambasuren.M
*/
public class ServiceLocator {
private static ServiceLocator serviceLocator = new ServiceLocator();
private Hashtable
private InitialContext context;
private ServiceLocator() {
try {
cache = new Hashtable
context = new InitialContext();
} catch (Exception ex) {
System.out.println("Exception in the constructor of ServiceLocator " + "class : " + ex.toString());
}
}
public static ServiceLocator getInstance() {
return serviceLocator;
}
public Object getService(String jndiName) throws ServiceLocatorException {
try {
if (!cache.containsKey(jndiName)) {
cache.put(jndiName, context.lookup(jndiName));
}
} catch (NamingException ex) {
ex.printStackTrace();
throw new ServiceLocatorException("Exception thrown from getService " + "method of ServiceLocator class : " + ex.getMessage());
} catch (SecurityException ex) {
ex.printStackTrace();
throw new ServiceLocatorException("Exception thrown from from getService " + "method of ServiceLocator class : " + ex.getMessage());
}
return cache.get(jndiName);
}
public DataSource getDataSource(String dataSourceName) throws ServiceLocatorException {
DataSource dataSource = null;
try {
dataSource = (DataSource) context.lookup(dataSourceName);
} catch (NamingException nex) {
throw new ServiceLocatorException(nex);
} catch (Exception ex) {
throw new ServiceLocatorException(ex);
}
return dataSource;
}
}
илүү чанартай дэлгэрэнгүй сайн жишээ олж үзеэ гэвэл PETSTOREDEMO гээд гүүглэ - ээс хайвал. sun - ийн блупринтийн жишээ олдоно.
try {
SimpleEntity simple = new SimpleEntity();
simple.setName("hello");
simple.setValue("world");
SimpleService service = (SimpleService)ServiceLocator.getInstance().getService(SimpleService.JNDI));
service.saveSimple(simple, SimpleSettings.SAVE_PERSIST);
} catch (Exception ex) {
System.out.println("Unknown Exception");
}
try {
SimpleRService rservice = (SimpleRService)ServiceLocator.getInstance().getService(SimpleRService.JNDI));
ArrayList
} catch (Exception ex) {
System.out.println("Unknown Exception");
}
3 сэтгэгдэл:
Yamar muuhai zambaraagui bolchihvoo. daraa orj tsegtstei bolgohoos.
chi yum bolgon deer l ooriinhoo neriig zoochhiin
Er oilgosongui. Yum bolgon deer neree zoochih yum gedeg chini .....