﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-just do it-随笔分类-EJB</title><link>http://www.blogjava.net/lzj520/category/29112.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 13 Mar 2008 17:57:39 GMT</lastBuildDate><pubDate>Thu, 13 Mar 2008 17:57:39 GMT</pubDate><ttl>60</ttl><item><title>EJB3 step by step 1</title><link>http://www.blogjava.net/lzj520/archive/2008/03/13/185996.html</link><dc:creator>lzj520</dc:creator><author>lzj520</author><pubDate>Thu, 13 Mar 2008 04:35:00 GMT</pubDate><guid>http://www.blogjava.net/lzj520/archive/2008/03/13/185996.html</guid><wfw:comment>http://www.blogjava.net/lzj520/comments/185996.html</wfw:comment><comments>http://www.blogjava.net/lzj520/archive/2008/03/13/185996.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lzj520/comments/commentRss/185996.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzj520/services/trackbacks/185996.html</trackback:ping><description><![CDATA[<p>新建一个EJB3项目，在WETA-INF目录下新建persistence.xml文件，其中"hibernate.hbm2ddl.auto" value="create-drop"，则不需要人工建立数据库表，会自动帮你建立。hibernate.dialect如果没写，也会提示出错。<br />
<br />
<strong>persistence.xml</strong><br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;persistence&gt;<br />
&nbsp; &lt;persistence-unit name="Ejb3"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;jta-data-source&gt;java:/ejb3Example&lt;/jta-data-source&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;properties&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="hibernate.hbm2ddl.auto"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value="create-drop"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/properties&gt;<br />
&nbsp; &lt;/persistence-unit&gt;<br />
&lt;/persistence&gt;<br />
<br />
建立entity bean：Book.java，这是一个普通POJO，里面使用JPA注释它是一个entity bean，在领域模型里，实体类继承Serializable接口实现序列化，有利于使用缓存。如果有提示@Table(name="book")<br />
出错，找不到数据库表，不用管它，最后系统会自动建立数据库表，当然，自己手动建立一个也可。</p>
<p><strong>Book.java</strong><br />
import java.io.Serializable;<br />
import javax.persistence.Entity;<br />
import javax.persistence.GeneratedValue;<br />
import javax.persistence.GenerationType;<br />
import javax.persistence.Id;<br />
import javax.persistence.SequenceGenerator;<br />
import javax.persistence.Table;<br />
import javax.persistence.TableGenerator;</p>
<p>@Entity<br />
@Table(name="book")<br />
@TableGenerator(&nbsp; name="book_id", table="primary_keys", pkColumnName="key", pkColumnValue="book",valueColumnName="value")<br />
public class Book implements Serializable {<br />
&nbsp;private static final long serialVersionUID = 1L;<br />
&nbsp;private Integer id;<br />
&nbsp;private String title;<br />
&nbsp;private String author;&nbsp;<br />
&nbsp;public String getAuthor() {<br />
&nbsp;&nbsp;return author;<br />
&nbsp;}</p>
<p>&nbsp;public void setAuthor(String author) {<br />
&nbsp;&nbsp;this.author = author;<br />
&nbsp;}</p>
<p>&nbsp;@Id<br />
&nbsp;@GeneratedValue(strategy = GenerationType.AUTO, generator = "book_id")<br />
&nbsp;<br />
&nbsp;public Integer getId() {<br />
&nbsp;&nbsp;return id;<br />
&nbsp;}</p>
<p>&nbsp;public void setId(Integer id) {<br />
&nbsp;&nbsp;this.id = id;<br />
&nbsp;}</p>
<p>&nbsp;public String getTitle() {<br />
&nbsp;&nbsp;return title;<br />
&nbsp;}</p>
<p>&nbsp;public void setTitle(String title) {<br />
&nbsp;&nbsp;this.title = title;<br />
&nbsp;}</p>
<p>&nbsp;public Book() {<br />
&nbsp;&nbsp;super();<br />
&nbsp;&nbsp;}<br />
&nbsp;<br />
&nbsp;public Book(Integer id, String title, String author) {<br />
&nbsp;&nbsp;super();<br />
&nbsp;&nbsp;this.id = id;<br />
&nbsp;&nbsp;this.title = title;<br />
&nbsp;&nbsp;this.author = author;<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;@Override<br />
&nbsp;public String toString() {<br />
&nbsp;&nbsp;// TODO Auto-generated method stub<br />
&nbsp;&nbsp;return "Book: " + getId() + " Title " + getTitle() + " Author "<br />
&nbsp;&nbsp;+ getAuthor();<br />
&nbsp;}<br />
}<br />
<br />
建立一个session bean：BookTestBean.java，并添加本地和远程接口BookTestBeanLocal.java、BookTestBeanRemote.java<br />
<br />
<strong>BookTestBean.java</strong><br />
import java.util.Iterator;<br />
import java.util.List;</p>
<p>import javax.ejb.Stateless;<br />
import javax.persistence.EntityManager;<br />
import javax.persistence.PersistenceContext;</p>
<p>@Stateless<br />
public class BookTestBean implements BookTestBeanLocal, BookTestBeanRemote {<br />
&nbsp;@PersistenceContext<br />
&nbsp;EntityManager em;<br />
&nbsp;public static final String RemoteJNDIName =&nbsp; BookTestBean.class.getSimpleName() + <br />
&nbsp;"/remote";<br />
&nbsp;public static final String LocalJNDIName =&nbsp; BookTestBean.class.getSimpleName() + <br />
&nbsp;"/local";<br />
&nbsp;public void test() {<br />
&nbsp;&nbsp;Book book = new Book(null, "My first bean book", "Sebastian");<br />
&nbsp;&nbsp;em.persist(book);<br />
&nbsp;&nbsp;Book book2 = new Book(null, "another book", "Paul");<br />
&nbsp;&nbsp;em.persist(book2);<br />
&nbsp;&nbsp;Book book3 = new Book(null, "EJB 3 developer guide, comes soon",<br />
&nbsp;&nbsp;"Sebastian");<br />
&nbsp;&nbsp;em.persist(book3);<br />
&nbsp;&nbsp;System.out.println("list some books");<br />
&nbsp;&nbsp;List someBooks = em.createQuery("from Book b where b.author=:name")<br />
&nbsp;&nbsp;.setParameter("name", "Sebastian").getResultList();<br />
&nbsp;&nbsp;for (Iterator iter = someBooks.iterator(); iter.hasNext();)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;Book element = (Book) iter.next();<br />
&nbsp;&nbsp;System.out.println(element);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;System.out.println("List all books");<br />
&nbsp;&nbsp;List allBooks = em.createQuery("from Book").getResultList();<br />
&nbsp;&nbsp;for (Iterator iter = allBooks.iterator(); iter.hasNext();)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;Book element = (Book) iter.next();<br />
&nbsp;&nbsp;&nbsp;System.out.println(element);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;System.out.println("delete a book");<br />
&nbsp;&nbsp;&nbsp;em.remove(book2);<br />
&nbsp;&nbsp;&nbsp;System.out.println("List all books");<br />
&nbsp;&nbsp;&nbsp; allBooks = em.createQuery("from Book").getResultList();<br />
&nbsp;&nbsp;&nbsp;for (Iterator iter = allBooks.iterator(); iter.hasNext();)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;Book element = (Book) iter.next();<br />
&nbsp;&nbsp;&nbsp;System.out.println(element);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
<strong>BookTestBeanLocal.java</strong><br />
</p>
<p>import javax.ejb.Local;</p>
<p>@Local<br />
public interface BookTestBeanLocal {<br />
&nbsp;public void test();<br />
}<br />
</p>
<p><br />
<strong>BookTestBeanRemote.java</strong><br />
</p>
<p>import javax.ejb.Remote;</p>
<p>@Remote<br />
public interface BookTestBeanRemote {<br />
&nbsp;public void test();<br />
}<br />
</p>
<p><br />
在%JBOSS_HOME%\server\default\deploy下新建文件EJB-DS.XML，相应的数据库写法，可在%JBOSS_HOME%\docs\examples\jca中找到。<br />
<br />
<strong>EJB-DS.XML</strong><br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;datasources&gt;<br />
&nbsp; &lt;local-tx-datasource&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;jndi-name&gt;ejb3Example&lt;/jndi-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;connection-url&gt;jdbc:mysql://localhost:3306/mysql&lt;/connection-url&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;driver-class&gt;com.mysql.jdbc.Driver&lt;/driver-class&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;user-name&gt;xx&lt;/user-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;password&gt;xx&lt;/password&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;exception-sorter-class-name&gt;org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter&lt;/exception-sorter-class-name&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;metadata&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;type-mapping&gt;mySQL&lt;/type-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/metadata&gt;<br />
&nbsp; &lt;/local-tx-datasource&gt;<br />
&lt;/datasources&gt;</p>
<p><br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/lzj520/080313a.jpg" border="0" /><br />
这是所用到的包。<br />
在JBOSS中部署成jar，查看是否部署成功。<br />
<br />
编写测试客户端TestClient.java,并在META-INF下添加jndi.properies。<br />
<strong><br />
TestClient.java</strong><br />
import java.util.Properties;<br />
import javax.naming.Context;<br />
import javax.naming.InitialContext;<br />
import javax.naming.NamingException;<br />
<br />
public class TestClient.java{</p>
<p>&nbsp;/**<br />
&nbsp; * @param args<br />
&nbsp; */<br />
&nbsp;public static void main(String[] args) {<br />
<br />
&nbsp;&nbsp;Context context;<br />
&nbsp;&nbsp;try<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp; context = new InitialContext();<br />
&nbsp;&nbsp;&nbsp; BookTestBeanRemote beanRemote = (BookTestBeanRemote) context.lookup(BookTestBean.RemoteJNDIName);<br />
&nbsp;&nbsp;&nbsp;beanRemote.test(); <br />
&nbsp;&nbsp;} catch (NamingException e)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;throw new RuntimeException(e);<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
}<br />
<br />
<strong>jndi.properies</strong><br />
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory<br />
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces<br />
java.naming.provider.url=localhost:1099<br />
<br />
此时客户端测试只需要一个J2EE包和jbossall-client.jar便可。如果客户端与服务器端的包有冲突或版本不同，就会有stream classdesc serialVersionUID = 4582256576523491346, local class serialVersionUID = 3844706474734439975这样的序列化出错。<br />
<br />
最后运行客户端测试。</p>
<img src ="http://www.blogjava.net/lzj520/aggbug/185996.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzj520/" target="_blank">lzj520</a> 2008-03-13 12:35 <a href="http://www.blogjava.net/lzj520/archive/2008/03/13/185996.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB异常：Cannot instantiate class: org.jnp.interfaces.NamingContextFactory</title><link>http://www.blogjava.net/lzj520/archive/2008/01/23/177318.html</link><dc:creator>lzj520</dc:creator><author>lzj520</author><pubDate>Wed, 23 Jan 2008 08:49:00 GMT</pubDate><guid>http://www.blogjava.net/lzj520/archive/2008/01/23/177318.html</guid><wfw:comment>http://www.blogjava.net/lzj520/comments/177318.html</wfw:comment><comments>http://www.blogjava.net/lzj520/archive/2008/01/23/177318.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lzj520/comments/commentRss/177318.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzj520/services/trackbacks/177318.html</trackback:ping><description><![CDATA[Cannot instantiate class: org.jnp.interfaces.NamingContextFactory [Root exception is java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory]<br />
<br />
解決方式: <br />
在classpath內,加上%JBoss Home%\client\jbossall-client.jar
<img src ="http://www.blogjava.net/lzj520/aggbug/177318.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzj520/" target="_blank">lzj520</a> 2008-01-23 16:49 <a href="http://www.blogjava.net/lzj520/archive/2008/01/23/177318.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>