??xml version="1.0" encoding="utf-8" standalone="yes"?>久久久国产午夜精品,麻豆精品蜜桃,丝袜视频国产在线播放http://www.aygfsteel.com/luluyanglu/category/38297.htmlzh-cnSun, 15 Mar 2009 17:02:25 GMTSun, 15 Mar 2009 17:02:25 GMT60JPA 单独使用http://www.aygfsteel.com/luluyanglu/archive/2009/03/16/259907.html大鱼大鱼Sun, 15 Mar 2009 16:09:00 GMThttp://www.aygfsteel.com/luluyanglu/archive/2009/03/16/259907.htmlhttp://www.aygfsteel.com/luluyanglu/comments/259907.htmlhttp://www.aygfsteel.com/luluyanglu/archive/2009/03/16/259907.html#Feedback0http://www.aygfsteel.com/luluyanglu/comments/commentRss/259907.htmlhttp://www.aygfsteel.com/luluyanglu/services/trackbacks/259907.html  

之前一直在用EJB3Q但现在惛_J2SE里面使用JPAQ因Z大喜ƢHibernate的XML文g配置?/p>

而用DB4O的时候,出现了一些莫名其妙的问题Q一直没解决Q就暂时搁下了?/p>

使用myeclipse 6开发jpa如下Q?/p>

1.创徏web project

2.djpa capabilitiesQ选择toplinkQ把自动创徏数据库的和更新persistence.xml的勾?/p>

3.切换成database explorer视图Q选择表,jpa逆向工程?/p>

4.试

生成的persistence.xml如下Q?/p>

<?xml version="1.0" encoding="UTF-8"?>
<persistence 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" version="1.0">
<persistence-unit name="JPAWebPU"
transaction-type="RESOURCE_LOCAL">
<provider>
oracle.toplink.essentials.PersistenceProvider
</provider>
<class>com.persia.entity.Consumer</class>
<properties>
<property name="toplink.jdbc.driver"
value="com.mysql.jdbc.Driver" />
<property name="toplink.jdbc.url"
value="jdbc:mysql://localhost:3306/ejb3" />
<property name="toplink.jdbc.user" value="root" />
<property name="toplink.jdbc.password" value="root" />
<property name="toplink.ddl-generation"
value="create-tables" />
</properties>
</persistence-unit>
</persistence>

 

生成的几个类如下Q?/p>

实体c:

package com.persia.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* Consumer entity.
*
* @author MyEclipse Persistence Tools
*/
@Entity
@Table(name = "consumer", catalog = "ejb3", uniqueConstraints = {})
public class Consumer implements java.io.Serializable {
// Fields
private Integer id;
private String name;
private String password;
// Constructors
/** default constructor */
public Consumer() {
}
/** full constructor */
public Consumer(Integer id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;
}
// Property accessors
@Id
@Column(name = "id", unique = true, nullable = false, insertable = true, updatable = true)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name = "name", unique = false, nullable = false, insertable = true, updatable = true, length = 45)
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
@Column(name = "password", unique = false, nullable = false, insertable = true, updatable = true, length = 45)
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
}
 

DAO接口

package com.persia.entity;
import java.util.List;
/**
* Interface for ConsumerDAO.
*
* @author MyEclipse Persistence Tools
*/
public interface IConsumerDAO {
/**
* Perform an initial save of a previously unsaved Consumer entity. All
* subsequent persist actions of this entity should use the #update()
* method. This operation must be performed within the a database
* transaction context for the entity's data to be permanently saved to the
* persistence store, i.e., database. This method uses the
* {@link javax.persistence.EntityManager#persist(Object) EntityManager#persist}
* operation.
*
* <pre>
* EntityManagerHelper.beginTransaction();
* IConsumerDAO.save(entity);
* EntityManagerHelper.commit();
* </pre>
*
* @param entity
*            Consumer entity to persist
* @throws RuntimeException
*             when the operation fails
*/
public void save(Consumer entity);
/**
* Delete a persistent Consumer entity. This operation must be performed
* within the a database transaction context for the entity's data to be
* permanently deleted from the persistence store, i.e., database. This
* method uses the
* {@link javax.persistence.EntityManager#remove(Object) EntityManager#delete}
* operation.
*
* <pre>
* EntityManagerHelper.beginTransaction();
* IConsumerDAO.delete(entity);
* EntityManagerHelper.commit();
* entity = null;
* </pre>
*
* @param entity
*            Consumer entity to delete
* @throws RuntimeException
*             when the operation fails
*/
public void delete(Consumer entity);
/**
* Persist a previously saved Consumer entity and return it or a copy of it
* to the sender. A copy of the Consumer entity parameter is returned when
* the JPA persistence mechanism has not previously been tracking the
* updated entity. This operation must be performed within the a database
* transaction context for the entity's data to be permanently saved to the
* persistence store, i.e., database. This method uses the
* {@link javax.persistence.EntityManager#merge(Object) EntityManager#merge}
* operation.
*
* <pre>
* EntityManagerHelper.beginTransaction();
* entity = IConsumerDAO.update(entity);
* EntityManagerHelper.commit();
* </pre>
*
* @param entity
*            Consumer entity to update
* @returns Consumer the persisted Consumer entity instance, may not be the
*          same
* @throws RuntimeException
*             if the operation fails
*/
public Consumer update(Consumer entity);
public Consumer findById(Integer id);
/**
* Find all Consumer entities with a specific property value.
*
* @param propertyName
*            the name of the Consumer property to query
* @param value
*            the property value to match
* @return List<Consumer> found by query
*/
public List<Consumer> findByProperty(String propertyName, Object value);
public List<Consumer> findByName(Object name);
public List<Consumer> findByPassword(Object password);
/**
* Find all Consumer entities.
*
* @return List<Consumer> all Consumer entities
*/
public List<Consumer> findAll();
}

 

DAOc?/p>

package com.persia.entity;
import java.util.List;
import java.util.logging.Level;
import javax.persistence.EntityManager;
import javax.persistence.Query;
/**
* A data access object (DAO) providing persistence and search support for
* Consumer entities. Transaction control of the save(), update() and delete()
* operations must be handled externally by senders of these methods or must be
* manually added to each of these methods for data to be persisted to the JPA
* datastore.
*
* @see com.persia.entity.Consumer
* @author MyEclipse Persistence Tools
*/
public class ConsumerDAO implements IConsumerDAO {
// property constants
public static final String NAME = "name";
public static final String PASSWORD = "password";
private EntityManager getEntityManager() {
return EntityManagerHelper.getEntityManager();
}
/**
* Perform an initial save of a previously unsaved Consumer entity. All
* subsequent persist actions of this entity should use the #update()
* method. This operation must be performed within the a database
* transaction context for the entity's data to be permanently saved to the
* persistence store, i.e., database. This method uses the
* {@link javax.persistence.EntityManager#persist(Object) EntityManager#persist}
* operation.
*
* <pre>
* EntityManagerHelper.beginTransaction();
* ConsumerDAO.save(entity);
* EntityManagerHelper.commit();
* </pre>
*
* @param entity
*            Consumer entity to persist
* @throws RuntimeException
*             when the operation fails
*/
public void save(Consumer entity) {
EntityManagerHelper.log("saving Consumer instance", Level.INFO, null);
try {
getEntityManager().persist(entity);
EntityManagerHelper.log("save successful", Level.INFO, null);
} catch (RuntimeException re) {
EntityManagerHelper.log("save failed", Level.SEVERE, re);
throw re;
}
}
/**
* Delete a persistent Consumer entity. This operation must be performed
* within the a database transaction context for the entity's data to be
* permanently deleted from the persistence store, i.e., database. This
* method uses the
* {@link javax.persistence.EntityManager#remove(Object) EntityManager#delete}
* operation.
*
* <pre>
* EntityManagerHelper.beginTransaction();
* ConsumerDAO.delete(entity);
* EntityManagerHelper.commit();
* entity = null;
* </pre>
*
* @param entity
*            Consumer entity to delete
* @throws RuntimeException
*             when the operation fails
*/
public void delete(Consumer entity) {
EntityManagerHelper.log("deleting Consumer instance", Level.INFO, null);
try {
entity = getEntityManager().getReference(Consumer.class,
entity.getId());
getEntityManager().remove(entity);
EntityManagerHelper.log("delete successful", Level.INFO, null);
} catch (RuntimeException re) {
EntityManagerHelper.log("delete failed", Level.SEVERE, re);
throw re;
}
}
/**
* Persist a previously saved Consumer entity and return it or a copy of it
* to the sender. A copy of the Consumer entity parameter is returned when
* the JPA persistence mechanism has not previously been tracking the
* updated entity. This operation must be performed within the a database
* transaction context for the entity's data to be permanently saved to the
* persistence store, i.e., database. This method uses the
* {@link javax.persistence.EntityManager#merge(Object) EntityManager#merge}
* operation.
*
* <pre>
* EntityManagerHelper.beginTransaction();
* entity = ConsumerDAO.update(entity);
* EntityManagerHelper.commit();
* </pre>
*
* @param entity
*            Consumer entity to update
* @returns Consumer the persisted Consumer entity instance, may not be the
*          same
* @throws RuntimeException
*             if the operation fails
*/
public Consumer update(Consumer entity) {
EntityManagerHelper.log("updating Consumer instance", Level.INFO, null);
try {
Consumer result = getEntityManager().merge(entity);
EntityManagerHelper.log("update successful", Level.INFO, null);
return result;
} catch (RuntimeException re) {
EntityManagerHelper.log("update failed", Level.SEVERE, re);
throw re;
}
}
public Consumer findById(Integer id) {
EntityManagerHelper.log("finding Consumer instance with id: " + id,
Level.INFO, null);
try {
Consumer instance = getEntityManager().find(Consumer.class, id);
return instance;
} catch (RuntimeException re) {
EntityManagerHelper.log("find failed", Level.SEVERE, re);
throw re;
}
}
/**
* Find all Consumer entities with a specific property value.
*
* @param propertyName
*            the name of the Consumer property to query
* @param value
*            the property value to match
* @return List<Consumer> found by query
*/
@SuppressWarnings("unchecked")
public List<Consumer> findByProperty(String propertyName, final Object value) {
EntityManagerHelper.log("finding Consumer instance with property: "
+ propertyName + ", value: " + value, Level.INFO, null);
try {
final String queryString = "select model from Consumer model where model."
+ propertyName + "= :propertyValue";
Query query = getEntityManager().createQuery(queryString);
query.setParameter("propertyValue", value);
return query.getResultList();
} catch (RuntimeException re) {
EntityManagerHelper.log("find by property name failed",
Level.SEVERE, re);
throw re;
}
}
public List<Consumer> findByName(Object name) {
return findByProperty(NAME, name);
}
public List<Consumer> findByPassword(Object password) {
return findByProperty(PASSWORD, password);
}
/**
* Find all Consumer entities.
*
* @return List<Consumer> all Consumer entities
*/
@SuppressWarnings("unchecked")
public List<Consumer> findAll() {
EntityManagerHelper.log("finding all Consumer instances", Level.INFO,
null);
try {
final String queryString = "select model from Consumer model";
Query query = getEntityManager().createQuery(queryString);
return query.getResultList();
} catch (RuntimeException re) {
EntityManagerHelper.log("find all failed", Level.SEVERE, re);
throw re;
}
}
}

 

q有一个非常有用的helper

package com.persia.entity;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
/**
* @author MyEclipse Persistence Tools
*/
public class EntityManagerHelper {
private static final EntityManagerFactory emf;
private static final ThreadLocal<EntityManager> threadLocal;
private static final Logger logger;
static {
emf = Persistence.createEntityManagerFactory("JPAWebPU");
threadLocal = new ThreadLocal<EntityManager>();
logger = Logger.getLogger("JPAWebPU");
logger.setLevel(Level.ALL);
}
public static EntityManager getEntityManager() {
EntityManager manager = threadLocal.get();
if (manager == null || !manager.isOpen()) {
manager = emf.createEntityManager();
threadLocal.set(manager);
}
return manager;
}
public static void closeEntityManager() {
EntityManager em = threadLocal.get();
threadLocal.set(null);
if (em != null) em.close();
}
public static void beginTransaction() {
getEntityManager().getTransaction().begin();
}
public static void commit() {
getEntityManager().getTransaction().commit();
}
public static void rollback() {
getEntityManager().getTransaction().rollback();
}
public static Query createQuery(String query) {
return getEntityManager().createQuery(query);
}
public static void log(String info, Level level, Throwable ex) {
logger.log(level, info, ex);
}
}

 

然后使用helper和daoq行试

package com.jpa.test;
import java.util.List;
import com.persia.entity.Consumer;
import com.persia.entity.ConsumerDAO;
import com.persia.entity.EntityManagerHelper;
public class JPATest {
/**
* @param args
*/
public static void main(String[] args) {
// 1.创徏 DAO
ConsumerDAO dao = new ConsumerDAO();
// 2.创徏实体c?/span>
Consumer c = new Consumer();
c.setName("jpa01");
c.setPassword("jianchi");
// 开始事?
EntityManagerHelper.beginTransaction();
// 3. 保存
dao.save(c);
// 提交事务真正保存实体到数据库
EntityManagerHelper.commit();
// 4. 列出数据库中所有对?/span>
List<Consumer> result = dao.findAll();
for(Consumer o : result) {
System.out.println(o.getId());
System.out.println(o.getName());
}
}
}

 

试实例如下Q?/p>

package test;
import java.util.List;
import dao.*;
public class JPATest {
public static void main(String[] args) {
// 1.创徏 DAO
StudentDAO dao = new StudentDAO();
// 2.创徏实体c?/span>
Student user = new Student();
user.setUsername("hellojpa test");
user.setPassword("jpa password");
user.setAge(20);
// 开始事?
EntityManagerHelper.beginTransaction();
// 3. 保存
dao.save(user);
// 提交事务真正保存实体到数据库
EntityManagerHelper.commit();
// 4. 列出数据库中所有对?/span>
List<Student> result = dao.findAll();
for(Student o : result) {
System.out.println(o.getId());
System.out.println(o.getUsername());
}
// 5. 更改用户?/span>
user.setUsername("试JPA");
// 开始事?
EntityManagerHelper.beginTransaction();
// 保存QJPA会自动更新变动过的字D)
dao.update(user);
// 提交事务真正保存实体到数据库
EntityManagerHelper.commit();
// 6. 查找所有年龄ؓ20的用P从第1个开始获取(W?个是W一条记录)
result = dao.findByAge(20, 1);
for(Student o : result) {
System.out.println(o.getId());
System.out.println(o.getUsername());
}
// 7. Ҏ ID 查找
user = dao.findById(2);
System.out.println(user.getUsername());
// 8. 删除
// 开始事?
EntityManagerHelper.beginTransaction();
// 保存QJPA会自动更新变动过的字D)
dao.delete(user);
// 提交事务真正保存实体到数据库
EntityManagerHelper.commit();
}
}

 

若部|到tomcatQ没有什么问题,也不要额外添加什么?/p>



大鱼 2009-03-16 00:09 发表评论
]]>
JPA是什?/title><link>http://www.aygfsteel.com/luluyanglu/archive/2009/03/15/259902.html</link><dc:creator>大鱼</dc:creator><author>大鱼</author><pubDate>Sun, 15 Mar 2009 15:42:00 GMT</pubDate><guid>http://www.aygfsteel.com/luluyanglu/archive/2009/03/15/259902.html</guid><wfw:comment>http://www.aygfsteel.com/luluyanglu/comments/259902.html</wfw:comment><comments>http://www.aygfsteel.com/luluyanglu/archive/2009/03/15/259902.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/luluyanglu/comments/commentRss/259902.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/luluyanglu/services/trackbacks/259902.html</trackback:ping><description><![CDATA[<div id="wmqeeuq" class="postTitle">JPA是什?</div> 定义 Java Persistence API<br /> JPA通过JDK 5.0注解或XML描述对象Q关p表的映关p,q将q行期的实体对象持久化到数据库中? <h2>h</h2> Sun引入新的JPA ORM规范Z两个原因Q其一Q简化现有Java EE和Java SE应用的对象持久化的开发工作;其二QSun希望整合对ORM技术,实现天下归一?br /> JPA由EJB 3.0软g专家l开发,作ؓJSR-220实现的一部分。但它不囿于EJB 3.0Q你可以在Web应用、甚x面应用中使用。JPA的宗旨是为POJO提供持久化标准规范,由此可见Q经q这几年的实跉|索,能够q容器独立q?行,方便开发和试的理念已l深入h心了。目前Hibernate 3.2、TopLink 10.1.3以及OpenJPA都提供了JPA的实现?br /> JPA的M思想和现有Hibernate、TopLinkQJDO{ORM框架大体一致。ȝ来说QJPA包括以下3斚w的技术:<br /> <strong>ORM映射元数?/strong><br /> JPA支持XML和JDK 5.0注解两种元数据的形式Q元数据描述对象和表之间的映关p,框架据此实体对象持久化到数据库表中Q?br /> <strong>JPA 的API</strong><br /> 用来操作实体对象Q执行CRUD操作Q框架在后台替我们完成所有的事情Q开发者从J琐的JDBC和SQL代码中解脱出来?br /> <strong>查询语言</strong><br /> q是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据Q避免程序的SQL语句紧密耦合? <h2>JPA的优?/h2> <strong>1 标准?/strong><br /> JPA ?JCP l织发布?Java EE 标准之一Q因此Q何声U符?JPA 标准的框枉遵@同样的架构,提供相同的访?APIQ这保证了基于JPA开发的企业应用能够l过量的修改就能够在不同的JPA框架下运行?br /> <strong>2 对容器Ҏ的支持</strong><br /> JPA 框架中支持大数据集、事务、ƈ发等容器U事务,q?JPA 越了简单持久化框架的局限,在企业应用发挥更大的作用?br /> <strong>3 单易用,集成方便</strong><br /> JPA的主要目标之一是提供更加单的~程模型Q在JPA框架下创建实体和创徏Java cML单,没有M的约束和限制Q只需要?javax.persistence.Entityq行注释QJPA的框架和接口也都非常单,没有太多特别的规则和设计模式的要求,开发者可以很Ҏ?掌握。JPAZ非R入式原则设计Q因此可以很Ҏ的和其它框架或者容器集成?br /> <strong>4 可媲JDBC的查询能?/strong><br /> JPA的查询语a是面向对象而非面向数据库的Q它以面向对象的自然语法构造查询语句,可以看成 是Hibernate HQL的等L。JPA定义了独特的JPQLQJava Persistence Query LanguageQ,JPQL是EJB QL的一U扩展,它是针对实体的一U查询语aQ操作对象是实体Q而不是关pL据库的表Q而且能够支持扚w更新和修攏VJOIN、GROUP BY、HAVING {通常只有 SQL 才能够提供的高查询Ҏ,甚至q能够支持子查询?br /> <strong>5 支持面向对象的高U特?/strong><br /> JPA 中能够支持面向对象的高Ҏ,如类之间的ѝ多态和cM间的复杂关系Q这L支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化? <h2>JPA的供应商</h2> JPA 的目标之一是制定一个可以由很多供应商实现的APIQƈ且开发h员可以编码来实现该APIQ而不是用私有供应商Ҏ的API。因此开发h员只需使用供应 商特有的API来获得JPA规范没有解决但应用程序中需要的功能。尽可能C用JPA APIQ但是当需要供应商公开但是规范中没有提供的功能Ӟ则用供应商Ҏ的API?br /> <strong>1 Hibernate</strong><br /> JPA是需要Provider来实现其功能的,Hibernate是JPA Provider中很强的一个,目前来说应该无h能出其右。从功能上来_JPA现在是Hibernate功能的一个子集。Hibernate ?.2开始,开始兼容JPA。Hibernate3.2获得了Sun TCK的JPA(Java Persistence API) 兼容认证?br /> 只要熟悉Hibernate或者其他ORM框架Q在使用JPA时会发现其实非常Ҏ上手。例?实体对象的状态,在Hibernate有自由、持久、游MU,JPA里有newQmanagedQdetachedQremovedQ明gh一看就?道,q些状态都是一一对应的。再如flushҎQ都是对应的Q而其他的再如说Query query = manager.createQuery(sql)Q它在Hibernate里写法上是sessionQ而在JPA中变成了managerQ所以从 Hibernate到JPA的代价应该是非常的<br /> 同样QJDOQ也开始兼容JPA。在ORM的领域中Q看来JPA已经是王道,规范是规范。在各大厂商的支持下QJPA的用开始变得广泛?br /> <strong>2 Spring</strong><br /> Spring + Hibernate 常常被称?Java Web 应用人气最旺的框架l合。而在 JCP 通过?Web Beans JSR Q却Ʋ将JSF + EJB + JPA 、来?JBoss SeamQSpring 除外Q的一些组件和EJB 3Q目前能够提供有基本拦截和依赖注入功能的?Session Bean 框架Q的一?Web l合q行标准化。如今的 Spring 2.0 ?JPA 提供了完整的 EJB 容器契约Q允?JPA在Q何环境内可以?Spring 理的服务层使用Q包?Spring 的所?AOP ?DI 增强Q。同Ӟ关于下一个Web应用l合会是 EJB、Spring + Hibernate q是 Spring + JPA 的论战,早已充斥于耟?br /> 在Spring 2.0.1中,正式提供对JPA的支持,q也促成了JPA的发展,要知道JPA的好处在于可以分M容器q行Q变得更加的z?br /> <strong>3 OpenJPA</strong><br /> OpenJPA ?Apache l织提供的开源项目,它实C EJB 3.0 中的 JPA 标准Qؓ开发者提供功能强大、用简单的持久化数据管理框架。OpenJPA 装了和关系型数据库交互的操作,让开发者把注意力集中在~写业务逻辑上。OpenJPA 可以作ؓ独立的持久层框架发挥作用Q也可以L的与其它 Java EE 应用框架或者符?EJB 3.0 标准的容器集成?br /> <strong>4 其它</strong><br /> 目前支持的实现包括Toplink、Hibernate Entitymanager{。TopLink以前需要收费,如今开源了。OpenJPA虽然免费Q但功能、性能、普及性等斚w更加需要加大力度?br /> 对于EJB来说Q实体Bean一直是被批评的对象Q由于其太复杂和庞大。JPA的出玎ͼ很大E度的分M复杂性。这让EJB的推q也变得Ҏ?br /> 总而言之,JPA规范主要x的仅是API的行为方面,而由各种实现完成大多数性能有关的调优。尽如此,所有可靠的实现都应该拥有某U数据缓存,以作为选择。但愿不久的来QJPA能成为真正的标准?br /> <strong>结</strong><br /> EJB 3.0和JPA 毫无疑问是Java EE 5的主要卖炏V在某些领域中,它们lJavaC֌带来了竞争优势,qJava 在其他领域与竞争Ҏ不分伯仲Q因为,不可否认Q目前某些领域尚不存在基于标准的ҎQ?br /> q去数年来,Spring Framework一直是EJB在企业领域的主要竞争Ҏ。EJB3.0规范解决了很多促qSpring兴v的问题。随着它的出现QEJB3.0毫无疑问比Spring提供了更好的开发体验——最引h注目的优势是它不需要配|文件?br /> JPA提供一U标准的OR映射解决ҎQ该解决Ҏ完全集成到EJB3?兼容的容器中。JPA的前辈将会l稳定发展,但是业务应用E序中的 raw 使用可能会减少。实?JPA 兼容的实体管理器g很可能是此类技术的发展方向?br /> Java EEpd规范的较大问题与JPA没有M关系。Java EE pd规范的问题涉及到 Web和EJB容器之间的集成。Spring在此领域仍然h主要竞争优势。JBoss的Seam目试使用自定义的Ҏ来解册一问题。Caucho Resin应用服务器试图扩展容器边界ƈ支持在Web容器中用@EJB注释。我们希望Java EE 5.1解军_集成的问题,为我们提供一个全面而标准的依赖性注入方法?br /> 在不久的来QSun可能会将JPA作ؓ一个单独的JSR对待Q同时JPAq可能作为Java SE的一部分。不q这些都不太重要Q重要的是,我们现在已经可以在脱d器的情况下、在Java SE应用中用JPA了?<br /> JPA已经作ؓ一对象持久化的标准,不但可以获得Java EE应用服务器的支持Q还可以直接在Java SE中用。开发者将无需在现有多UORM框架中艰隑֜选择Q按照Sun的预惻I现有ORM框架头顶的光环将渐渐暗EQ不再具有以往的吸引力? <img src ="http://www.aygfsteel.com/luluyanglu/aggbug/259902.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/luluyanglu/" target="_blank">大鱼</a> 2009-03-15 23:42 <a href="http://www.aygfsteel.com/luluyanglu/archive/2009/03/15/259902.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JPA注释参考手?/title><link>http://www.aygfsteel.com/luluyanglu/archive/2009/03/15/259895.html</link><dc:creator>大鱼</dc:creator><author>大鱼</author><pubDate>Sun, 15 Mar 2009 14:41:00 GMT</pubDate><guid>http://www.aygfsteel.com/luluyanglu/archive/2009/03/15/259895.html</guid><wfw:comment>http://www.aygfsteel.com/luluyanglu/comments/259895.html</wfw:comment><comments>http://www.aygfsteel.com/luluyanglu/archive/2009/03/15/259895.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/luluyanglu/comments/commentRss/259895.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/luluyanglu/services/trackbacks/259895.html</trackback:ping><description><![CDATA[<div> <h2>Table</h2> <p>Table用来定义entity主表的nameQcatalogQschema{属性?</p> <p>元数据属性说明: </p> <ul> <li>name: 表名 <li>catalog: 对应关系数据库中的catalog <li>schemaQ对应关pL据库中的schema <li>UniqueConstraints:定义一个UniqueConstraint数组Q指定需要徏唯一U束的列 </li> </ul> <div> <pre> <br /> @Entity<br /> @Table(name="CUST")<br /> public class Customer { ... }<br />   </pre> </div> </div> <div> <h2>SecondaryTable</h2> <p>一个entity class可以映射到多表,SecondaryTable用来定义单个从表的名字,主键名字{属性?</p> <p>元数据属性说明: </p> <ul> <li>name: 表名 <li>catalog: 对应关系数据库中的catalog <li>schemaQ对应关pL据库中的schema <li>pkJoin: 定义一个PrimaryKeyJoinColumn数组Q指定从表的主键? <li>UniqueConstraints:定义一个UniqueConstraint数组Q指定需要徏唯一U束的列 </li> </ul> <p>下面的代码说明CustomercL到两个表,主表名是CUSTOMERQ从表名是CUST_DETAILQ从表的主键列和主表的主键列cd相同Q列名ؓCUST_ID?</p> <div> <pre> <br /> @Entity<br /> @Table(name="CUSTOMER")<br /> @SecondaryTable(name="CUST_DETAIL",pkJoin=@PrimaryKeyJoinColumn(name="CUST_ID"))<br /> public class Customer { ... }<br /> <br /> </pre> </div> </div> <div> <h2>SecondaryTables</h2> <p>当一个entity class映射C个主表和多个从表Ӟ用SecondaryTables来定义各个从表的属性?</p> <p>元数据属性说明: </p> <ul> <li>valueQ?定义一个SecondaryTable数组Q指定每个从表的属性?</li> </ul> <div> <pre> <br /> @Table(name = "CUSTOMER")<br /> @SecondaryTables( value = {<br /> @SecondaryTable(name = "CUST_NAME", pkJoin = { @PrimaryKeyJoinColumn(name = "STMO_ID", referencedColumnName = "id") }),<br /> @SecondaryTable(name = "CUST_ADDRESS", pkJoin = { @PrimaryKeyJoinColumn(name = "STMO_ID", referencedColumnName = "id") }) })<br /> public class Customer {}<br /> <br /> </pre> </div> </div> <div> <h2>UniqueConstraint</h2> <p>UniqueConstraint定义在Table或SecondaryTable元数据里Q用来指定徏表时需要徏唯一U束的列?</p> <p>元数据属性说明: </p> <ul> <li>columnNames:定义一个字W串数组Q指定要建唯一U束的列名?</li> </ul> <div> <pre> <br /> @Entity<br /> @Table(name="EMPLOYEE",<br /> uniqueConstraints={@UniqueConstraint(columnNames={"EMP_ID", "EMP_NAME"})}<br /> )<br /> public class Employee { ... }<br /> <br /> </pre> </div> </div> <div> <h2>Column</h2> <p>Column元数据定义了映射到数据库的列的所有属性:列名Q是否唯一Q是否允ؓI,是否允许更新{?</p> <p>元数据属性说明: </p> <ul> <li>name:列名? <li>unique: 是否唯一 <li>nullable: 是否允许为空 <li>insertable: 是否允许插入 <li>updatable: 是否允许更新 <li>columnDefinition: 定义时创建此列的DDL <li>secondaryTable: 从表名。如果此列不建在主表上(默认建在主表Q,该属性定义该列所在从表的名字?</li> </ul> <div> <pre> <br /> public class Person {<br /> @Column(name = "PERSONNAME", unique = true, nullable = false, updatable = true)<br /> private String name;<br /> <br /> @Column(name = "PHOTO", columnDefinition = "BLOB NOT NULL", secondaryTable="PER_PHOTO")<br /> private byte[] picture;<br /> <br /> </pre> </div> </div> <div> <h2>JoinColumn</h2> <p>如果在entity class的field上定义了关系Qone2one或one2many{)Q我们通过JoinColumn来定义关pȝ属性。JoinColumn的大部分属性和ColumncM?</p> <p>元数据属性说明: </p> <ul> <li>name:列名? <li>referencedColumnName:该列指向列的列名Q徏表时该列作ؓ外键列指向关pd一端的指定列) <li>unique: 是否唯一 <li>nullable: 是否允许为空 <li>insertable: 是否允许插入 <li>updatable: 是否允许更新 <li>columnDefinition: 定义时创建此列的DDL <li>secondaryTable: 从表名。如果此列不建在主表上(默认建在主表Q,该属性定义该列所在从表的名字?</li> </ul> <p>下面的代码说明Custom和Order是一对一关系。在Order对应的映表Z个名为CUST_ID的列Q该列作为外键指向Custom对应表中名ؓID的列?</p> <div> <pre> <br /> public class Custom {<br /> <br /> @OneToOne<br /> @JoinColumn(<br /> name="CUST_ID", referencedColumnName="ID", unique=true, nullable=true, updatable=true)<br /> public order getOrder() {<br /> return order;<br /> }<br /> <br /> </pre> </div> </div> <div> <h2>JoinColumns</h2> <p>如果在entity class的field上定义了关系Qone2one或one2many{)Qƈ且关pd在多个JoinColumnQ用JoinColumns定义多个JoinColumn的属性?</p> <p>元数据属性说明: </p> <ul> <li>value: 定义JoinColumn数组Q指定每个JoinColumn的属性?</li> </ul> <p>下面的代码说明Custom和Order是一对一关系。在Order对应的映表Z列,一列名为CUST_IDQ该列作为外键指向Custom对应表中名ؓID的列,另一列名为CUST_NAMEQ该列作为外键指向Custom对应表中名ؓNAME的列?</p> <div> <pre> <br /> public class Custom {<br /> @OneToOne<br /> @JoinColumns({<br /> @JoinColumn(name="CUST_ID", referencedColumnName="ID"),<br /> @JoinColumn(name="CUST_NAME", referencedColumnName="NAME")<br /> })<br /> public order getOrder() {<br /> return order;<br /> }<br /> <br /> </pre> </div> </div> <div> <h2>Id</h2> <p>声明当前field为映表中的主键列。id值的获取方式有五U:TABLE, SEQUENCE, IDENTITY, AUTO, NONE。Oracle和DB2支持SEQUENCEQSQL Server和Sybase支持IDENTITY,mysql支持AUTO。所有的数据库都可以指定为AUTOQ我们会Ҏ不同数据库做转换。NONE (默认)需要用戯己指定Id的倹{元数据属性说明: </p> <ul> <li>generate():主键值的获取cd <li>generator():TableGenerator的名字(当generate=GeneratorType.TABLE才需要指定该属性) </li> </ul> <p>下面的代码声明Task的主键列id是自动增长的?Oracle和DB2从默认的SEQUENCE取|SQL Server和Sybase该列建成IDENTITYQmysql该列建成auto increment? </p> <div> <pre> <br /> @Entity<br /> @Table(name = "OTASK")<br /> public class Task {<br /> @Id(generate = GeneratorType.AUTO)<br /> public Integer getId() {<br /> return id;<br /> }<br /> }<br /> <br /> </pre> </div> </div> <div> <h2>IdClass</h2> <p>当entity class使用复合主键Ӟ需要定义一个类作ؓid class。id class必须W合以下要求:cdd明ؓpublicQƈ提供一个声明ؓpublic的空构造函数。必d现Serializable接,覆写 equals()和hashCodeQ)Ҏ。entity class的所有id field在id class都要定义Q且cd一栗?</p> <p>元数据属性说明: </p> <ul> <li>value: id class的类?</li> </ul> <p>  </p> <div> <pre> <br /> public class EmployeePK implements java.io.Serializable{<br /> String empName;<br /> Integer empAge;<br /> <br /> public EmployeePK(){}<br /> <br /> public boolean equals(Object obj){ ......}<br /> public int hashCode(){......}<br /> }<br /> <br /> <br /> @IdClass(value=com.acme.EmployeePK.class)<br /> @Entity(access=FIELD)<br /> public class Employee {<br /> @Id String empName;<br /> @Id Integer empAge;<br /> }<br /> <br /> </pre> </div> </div> <div> <h2>MapKey</h2> <p>在一对多Q多对多关系中,我们可以用Map来保存集合对象。默认用主键值做keyQ如果用复合主键,则用id class的实例做keyQ如果指定了name属性,q指定的field的值做key?</p> <p>元数据属性说明: </p> <ul> <li>name: 用来做key的field名字 </li> </ul> <p>下面的代码说明Person和Book之间是一对多关系。Person的books字段是MapcdQ用Book的isbn字段的g为Map的key?</p> <div> <pre> <br /> @Table(name = "PERSON")<br /> public class Person {<br /> <br /> @OneToMany(targetEntity = Book.class, cascade = CascadeType.ALL, mappedBy = "person")<br /> @MapKey(name = "isbn")<br /> private Map books = new HashMap();<br /> }<br /> <br /> </pre> </div> </div> <div> <h2>OrderBy</h2> <p>在一对多Q多对多关系中,有时我们希望从数据库加蝲出来的集合对象是按一定方式排序的Q这可以通过OrderBy来实玎ͼ默认是按对象的主键升序排列?</p> <p>元数据属性说明: </p> <ul> <li>value: 字符串类型,指定排序方式。格式ؓ"fieldName1 [ASC|DESC],fieldName2 [ASC|DESC],......",排序cd可以不指定,默认是ASC?</li> </ul> <p>下面的代码说明Person和Book之间是一对多关系。集合books按照Book的isbn升序Qname降序排列?</p> <div> <pre> <br /> @Table(name = "MAPKEY_PERSON")<br /> public class Person {<br /> <br /> @OneToMany(targetEntity = Book.class, cascade = CascadeType.ALL, mappedBy = "person")<br /> @OrderBy(name = "isbn ASC, name DESC")<br /> private List books = new ArrayList();<br /> }<br /> <br /> </pre> </div> </div> <div> <h2>PrimaryKeyJoinColumn</h2> <p>在三U情况下会用到PrimaryKeyJoinColumn?</p> <ul> <li>l承? <li>entity class映射C个或多个从表。从表根据主表的主键列(列名为referencedColumnName值的列)Q徏立一个类型一L主键列,列名由name属性定义? <li>one2one关系Q关pȝ护端的主键作为外键指向关p被l护端的主键Q不再新Z个外键列?</li> </ul> <p>  </p> <p>元数据属性说明: </p> <ul> <li>name:列名? <li>referencedColumnName:该列引用列的列名 <li>columnDefinition: 定义时创建此列的DDL </li> </ul> <p>下面的代码说明Customer映射C个表Q主表CUSTOMER,从表CUST_DETAILQ从表需要徏立主键列CUST_IDQ该列和主表的主键列id除了列名不同Q其他定义一栗?</p> <div> <pre> <br /> @Entity<br /> @Table(name="CUSTOMER")<br /> @SecondaryTable(name="CUST_DETAIL",pkJoin=@PrimaryKeyJoinColumn(name="CUST_ID"QreferencedColumnName="id"))<br /> public class Customer { <br /> @Id(generate = GeneratorType.AUTO)<br /> public Integer getId() {<br /> return id;<br /> }<br /> }<br /> <br /> </pre> </div> <p>下面的代码说明Employee和EmployeeInfo是一对一关系QEmployee的主键列id作ؓ外键指向EmployeeInfo的主键列INFO_ID?</p> <div> <pre> <br /> @Table(name = "Employee")<br /> public class Employee {<br /> @OneToOne<br /> @PrimaryKeyJoinColumn(name = "id", referencedColumnName="INFO_ID")<br /> EmployeeInfo info;<br /> }<br /> <br /> </pre> </div> </div> <div> <h2>PrimaryKeyJoinColumns</h2> <p>如果entity class使用了复合主键,指定单个PrimaryKeyJoinColumn不能满要求Ӟ可以用PrimaryKeyJoinColumns来定义多个PrimaryKeyJoinColumn?</p> <p>元数据属性说明: </p> <ul> <li>value: 一个PrimaryKeyJoinColumn数组Q包含所有PrimaryKeyJoinColumn?</li> </ul> <p>下面的代码说明了Employee和EmployeeInfo是一对一关系。他们都使用复合主键Q徏表时需要在Employee表徏立一个外键,从Employee的主键列id,name指向EmployeeInfo的主键列INFO_ID和INFO_NAME. </p> <div> <pre> <br /> @Entity<br /> @IdClass(EmpPK.class)<br /> @Table(name = "EMPLOYEE")<br /> public class Employee {<br /> <br /> private int id;<br /> <br /> private String name;<br /> <br /> private String address;<br /> <br /> @OneToOne(cascade = CascadeType.ALL)<br /> @PrimaryKeyJoinColumns({<br /> @PrimaryKeyJoinColumn(name="id", referencedColumnName="INFO_ID"),<br /> @PrimaryKeyJoinColumn(name="name" , referencedColumnName="INFO_NAME")})<br /> EmployeeInfo info;<br /> }<br /> <br /> @Entity<br /> @IdClass(EmpPK.class)<br /> @Table(name = "EMPLOYEE_INFO")<br /> public class EmployeeInfo {<br /> <br /> @Id<br /> @Column(name = "INFO_ID")<br /> private int id;<br /> <br /> @Id<br /> @Column(name = "INFO_NAME")<br /> private String name;<br /> }<br /> <br /> </pre> </div> </div> <div> <h2>Transient</h2> <p>Transient用来注释entity的属性,指定的这些属性不会被持久化,也不会ؓq些属性徏表?</p> <div> <pre> <br /> @Transient<br /> private String name;<br /> <br /> </pre> </div> </div> <div> <h2>Version</h2> <p>Version指定实体cd乐观事务中的version属性。在实体c重新由EntityManager理q且加入C观事务中Ӟ保证完整性。每一个类只能有一个属性被指定为versionQversion属性应该映到实体cȝ主表上?</p> <p>下面的代码说明versionNum属性作个类的versionQ映到数据库中主表的列名是OPTLOCK?</p> <div> <pre> <br /> @Version<br /> @Column("OPTLOCK")<br /> protected int getVersionNum() { return versionNum; }<br /> <br /> </pre> </div> </div> <div> <h2>Lob</h2> <p>Lob指定一个属性作为数据库支持的大对象cd在数据库中存储。用LobTypeq个枚D来定义Lob是二q制cdq是字符cd?</p> <p>LobType枚Dcd说明Q?</p> <ul> <li>BLOB 二进制大对象QByte[]或者Serializable的类型可以指定ؓBLOB? <li>CLOB 字符型大对象Qchar[]、Character[]或Stringcd可以指定为CLOB?</li> </ul> <p>元数据属性说明: </p> <ul> <li>fetchQ?定义q个字段是lazy loadedq是eagerly fetched。数据类型是FetchType枚DQ默认ؓLAZY,即lazy loaded. <li>typeQ?定义q个字段在数据库中的JDBC数据cd。数据类型是LobType枚DQ默认ؓBLOB?</li> </ul> <p>下面的代码定义了一个BLOBcd的属性和一个CLOBcd的属性?</p> <div> <pre> <br /> @Lob<br /> @Column(name="PHOTO" columnDefinition="BLOB NOT NULL")<br /> protected JPEGImage picture;<br /> <br /> @Lob(fetch=EAGER, type=CLOB)<br /> @Column(name="REPORT")<br /> protected String report;<br /> <br /> </pre> </div> </div> <div> <h2>JoinTable</h2> <p>JoinTable在many-to-many关系的所有者一边定义。如果没有定义JoinTableQ用JoinTable的默认倹{?</p> <p>元数据属性说明: </p> <ul> <li>table:q个join table的Table定义? <li>joinColumns:定义指向所有者主表的外键列,数据cd是JoinColumn数组? <li>inverseJoinColumns:定义指向非所有者主表的外键列,数据cd是JoinColumn数组?</li> </ul> <p>下面的代码定义了一个连接表CUST和PHONE的join table。join table的表名是CUST_PHONEQ包含两个外键,一个外键是CUST_IDQ指向表CUST的主键IDQ另一个外键是PHONE_IDQ指向表PHONE的主键ID?</p> <div> <pre> <br /> @JoinTable(<br /> table=@Table(name=CUST_PHONE),<br /> joinColumns=@JoinColumn(name="CUST_ID", referencedColumnName="ID"),<br /> inverseJoinColumns=@JoinColumn(name="PHONE_ID", referencedColumnName="ID")<br /> )<br /> <br /> </pre> </div> </div> <div> <h2>TableGenerator</h2> <p>TableGenerator定义一个主键值生成器Q在Idq个元数据的generateQTABLEӞgenerator属性中可以使用生成器的名字。生成器可以在类、方法或者属性上定义?</p> <p>生成器是为多个实体类提供q箋的ID值的表,每一行ؓ一个类提供ID|ID值通常是整数?</p> <p>元数据属性说明: </p> <ul> <li>name:生成器的唯一名字Q可以被Id元数据用? <li>table:生成器用来存储id值的Table定义? <li>pkColumnName:生成器表的主键名U? <li>valueColumnName:生成器表的ID值的列名U? <li>pkColumnValue:生成器表中的一行数据的主键倹{? <li>initialValue:id值的初始倹{? <li>allocationSize:id值的增量?</li> </ul> <p>下面的代码定义了两个生成器empGen和addressGenQ生成器的表是ID_GEN?</p> <div> <pre> <br /> @Entity public class Employee {<br /> ...<br /> @TableGenerator(name="empGen",<br /> table=@Table(name="ID_GEN"),<br /> pkColumnName="GEN_KEY",<br /> valueColumnName="GEN_VALUE",<br /> pkColumnValue="EMP_ID",<br /> allocationSize=1)<br /> @Id(generate=TABLE, generator="empGen")<br /> public int id;<br /> ...<br /> }<br /> <br /> @Entity public class Address {<br /> ...<br /> @TableGenerator(name="addressGen",<br /> table=@Table(name="ID_GEN"),<br /> pkColumnValue="ADDR_ID")<br /> @Id(generate=TABLE, generator="addressGen")<br /> public int id;<br /> ...<br /> }<br /> <br /> </pre> </div> </div> <div> <h2>SequenceGenerator</h2> <p>SequenceGenerator定义一个主键值生成器Q在Idq个元数据的generator属性中可以使用生成器的名字。生成器可以在类、方法或者属性上定义。生成器是数据库支持的sequence对象?</p> <p>元数据属性说明: </p> <ul> <li>name:生成器的唯一名字Q可以被Id元数据用? <li>sequenceName:数据库中Qsequence对象的名U。如果不指定Q会使用提供商指定的默认名称? <li>initialValue:id值的初始倹{? <li>allocationSize:id值的增量?</li> </ul> <p>下面的代码定义了一个用提供商默认名称的sequence生成器?</p> <div> <pre> <br /> @SequenceGenerator(name="EMP_SEQ", allocationSize=25) <br /> <br /> </pre> </div> </div> <div> <h2>DiscriminatorColumn</h2> <p>DiscriminatorColumn定义在用SINGLE_TABLE或JOINEDl承{略的表中区别不l承层次的列?</p> <p>元数据属性说明: </p> <ul> <li>name:column的名字。默认gؓTYPE? <li>columnDefinition:生成DDL的sql片断? <li>length:Stringcd的column的长度,其他cd使用默认?0?</li> </ul> <p>下面的代码定义了一个列名ؓDISCQ长度ؓ20的Stringcd的区别列?</p> <div> <pre> <br /> @Entity<br /> @Table(name="CUST")<br /> @Inheritance(strategy=SINGLE_TABLE,<br /> discriminatorType=STRING,<br /> discriminatorValue="CUSTOMER")<br /> @DiscriminatorColumn(name="DISC", length=20)<br /> public class Customer { ... }</pre> </div> </div> <br /> <img src ="http://www.aygfsteel.com/luluyanglu/aggbug/259895.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/luluyanglu/" target="_blank">大鱼</a> 2009-03-15 22:41 <a href="http://www.aygfsteel.com/luluyanglu/archive/2009/03/15/259895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">Ȫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ǿ</a>| <a href="http://" target="_blank">ͬ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">߰</a>| <a href="http://" target="_blank">ϴ</a>| <a href="http://" target="_blank">̨</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Һ</a>| <a href="http://" target="_blank">տ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ذ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˼</a>| <a href="http://" target="_blank">ľ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">峣</a>| <a href="http://" target="_blank">׺</a>| <a href="http://" target="_blank">ƽ̶</a>| <a href="http://" target="_blank">SHOW</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̫</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>