ejb3内构建webservice时,如果用到JPA且数据源配置在EAR包内,压缩发布,会报hibernate实体为映射的错误。
javax.ejb.EJBTransactionRolledbackException: org.hibernate.hql.ast.QuerySyntaxException: User is not mapped,请高人指点迷津。环境:ejb3、jboss5.1、eclipse3.5一下情况均可以正常运行:
1.不使用压缩ear包的发布方式,直接发布ear文件夹。
2.不使用webservice,注释掉@webservice注解
3.数据源local-tx-datasource从jboss-home/server/default/deploy/内的xxx-ds.xml配置。
具体错误:
项目结构如下:|-ejb_01.jar(ejb项目)
   -com.yh.beans
     User.java
   -com.yh.dao
     UserDAO.java
     UserDAOImpl.java
   -com.yh.service
     UserService.java
     UserServiceImpl.java
     WS01.java
     WS01Impl.java
   -META-INF
     persistence.xml
|-ejb_01EAR (ear项目)
  -EarContent
   -META-INF
     -hzyl-ds.xml (数据源配置)主要代码如下:@Entity
public class User {
@Id
@GeneratedValue
private int id;
@Column(length=50)
private String name;
private String address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}public interface UserDAO {
public List<User> getAllUsers();
}@Stateless(name = "userDAO")
@Local
public class UserDAOImpl implements UserDAO {

@PersistenceContext(unitName="test")
EntityManager em; @Override
public List<User> getAllUsers() {
        Query query = em.createQuery("from User");
        return query.getResultList();
}}public interface UserService {
public String getAllUsers();
}@Stateless(name="userService")
@Remote
public class UserServiceImpl implements UserService { @EJB
@IgnoreDependency
UserDAO userDAO;

@Override
public String getAllUsers() {
String names="";
List<User> users = userDAO.getAllUsers();

for(User u : users){
names=names+","+u.getName();

System.out.println(u.getId());
} return names;
}
}@Stateless(name="WS01")
@WebService public interface WS01 {
@WebMethod
public String getAllUsers();
}
public class WS01Impl implements WS01 {
@Override
public String getAllUsers() {
return "hello"; }}
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">
<jta-data-source>java:/hzyl-ds</jta-data-source>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="hibernate.show_sql" value="true" />      
<!--  表结构维护策略  -->
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>
hzyl-ds.xml:<?xml version="1.0" encoding="UTF-8"?>
<datasources>
  <local-tx-datasource>
    <jndi-name>hzyl-ds</jndi-name>
    <connection-url>jdbc:mysql://localhost:3309/test</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <user-name>root</user-name>
    <password>123456</password>
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
    <!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->
    <metadata>
       <type-mapping>mySQL</type-mapping>
    </metadata>
  </local-tx-datasource>
</datasources>