刚学ejb3,照着教程连接Mysql数据库顺利完成,但自己试着连接oracle10g快捷版时出现了一些问题,自己搞了好久都没有搞定,只能上来这里求助,请大虾们帮忙。我用的是jboss,驱动和数据源配置文件都没问题的,下面先贴出我写的东西:
1,persistence.xml
<?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= "EJBUserPU " transaction-type= "JTA ">
<jta-data-source> java:/DefaultOracleDS </jta-data-source>
<properties>
<!-- 显示最终执行的SQL -->
<property name= "hibernate.show_sql " value= "true "/>
<!-- 格式化显示的SQL -->
<property name= "hibernate.format_sql " value= "true "/>
</properties>
</persistence-unit>
</persistence>
2,单表映射实体(表建好的了)
package huizhi.sessionbean; import java.io.Serializable; import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table; @Entity
@Table(name= "user_zxl ")
public class User implements Serializable{ private int id;
private String name;
private int age;
private String phone;
private String address; @Id
@GeneratedValue(strategy = GenerationType.AUTO)
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
} @Column(nullable=true)
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
} @Column(nullable=true)
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
} @Column(nullable=true)
public String getPhone() {
return this.phone;
}
public void setPhone(String phone) {
this.phone = phone;
} @Column(nullable=true)
public String getAddress() {
return this.address;
}
public void setAddress(String address) {
this.address = address;
}
}
3,实体操作实例
package huizhi.sessionbean; import java.util.List; import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query; @Stateless
@Remote(UserDao.class)
public class UserDaobean implements UserDao {
@PersistenceContext(unitName= "EJBUserPU ") protected EntityManager em;
public void deleteUser(int userid) {
User user=em.find(User.class, userid);
if(user!=null) em.remove(user);
} public User getUserByID(int userid) {
return em.find(User.class, userid);
} @SuppressWarnings( "unchecked ")
public List <User> getUserList() {
Query query=em.createQuery( "select o from User o order by o.id asc ");
return (List <User> )query.getResultList();
} public void insertUser(User user) {
em.persist(user); } public void mergeUser(User user) {
em.merge(user); } public void updateName(String newname, int userid) {
User user=em.find(User.class, userid);
if(user!=null) user.setName(newname);
} }
4,jsp测试页面
<%@ page language= "java " import= "java.util.* " pageEncoding= "ISO-8859-1 "%>
<%@ page import= "huizhi.sessionbean.*,javax.naming.*,java.util.List " %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+ ":// "+request.getServerName()+ ": "+request.getServerPort()+path+ "/ ";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN ">
<html>
<head>
<base href= " <%=basePath%> ">
<title> My JSP 'index.jsp ' starting page </title>
<meta http-equiv= "pragma " content= "no-cache ">
<meta http-equiv= "cache-control " content= "no-cache ">
<meta http-equiv= "expires " content= "0 ">
<meta http-equiv= "keywords " content= "keyword1,keyword2,keyword3 ">
<meta http-equiv= "description " content= "This is my page ">
<!--
<link rel= "stylesheet " type= "text/css " href= "styles.css ">
-->
</head>
<body>
<table width= "80% " border= "1 ">
<tr bgcolor= "#DFDFDF ">
<td> id </td>
<td> name </td>
<td> age </td>
<td> phone </td>
<td> address </td>
</tr>
<%
try{
InitialContext ctx = new InitialContext();
UserDao userdao=(UserDao)ctx.lookup( "UserDaobean/remote ");
userdao.updateName( "lili ",1);
List <User> users = userdao.getUserList();
for(User user:users){
out.println( " <tr> <td> "+user.getId()+ " </td> <td> "+user.getName()+ " </td> <td> "+user.getAge()+ " </td> <td> "+user.getPhone()+ " </td> <td> "+user.getAddress()+ " </td> </tr> ");
}
}catch(Exception e){
out.println(e);
}
%>
</table>
</body>
</html>
最后是报错信息:
16:39:45,515 INFO [STDOUT] Hibernate:
select
user0_.id as id4_0_,
user0_.address as address4_0_,
user0_.age as age4_0_,
user0_.name as name4_0_,
user0_.phone as phone4_0_
from
user_zxl user0_
where
user0_.id=?
16:39:45,515 WARN [JDBCExceptionReporter] SQL Error: 942, SQLState: 42000
16:39:45,515 ERROR [JDBCExceptionReporter] ORA-00942: 表或视图不存在 16:31:37,546 INFO [STDOUT] Hibernate:
select
user0_.id as id2_0_,
user0_.address as address2_0_,
user0_.age as age2_0_,
user0_.name as name2_0_,
user0_.phone as phone2_0_
from
"user_zxl " user0_
where
user0_.id=?
16:31:37,562 WARN [JDBCExceptionReporter] SQL Error: 904, SQLState: 42000
16:31:37,562 ERROR [JDBCExceptionReporter] ORA-00904: "USER0_ ". "ID ": 标识符无效 据我自己所知,oracle数据库的查询语名中的字段名和表名是要加双引号的,例如,select "name " from "user_zxl ";可是用ejb连接的时候,那些语句是自动生成的,请问大虾们要怎么解决啊,这个问题困扰了我好久。
1,persistence.xml
<?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= "EJBUserPU " transaction-type= "JTA ">
<jta-data-source> java:/DefaultOracleDS </jta-data-source>
<properties>
<!-- 显示最终执行的SQL -->
<property name= "hibernate.show_sql " value= "true "/>
<!-- 格式化显示的SQL -->
<property name= "hibernate.format_sql " value= "true "/>
</properties>
</persistence-unit>
</persistence>
2,单表映射实体(表建好的了)
package huizhi.sessionbean; import java.io.Serializable; import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table; @Entity
@Table(name= "user_zxl ")
public class User implements Serializable{ private int id;
private String name;
private int age;
private String phone;
private String address; @Id
@GeneratedValue(strategy = GenerationType.AUTO)
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
} @Column(nullable=true)
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
} @Column(nullable=true)
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
} @Column(nullable=true)
public String getPhone() {
return this.phone;
}
public void setPhone(String phone) {
this.phone = phone;
} @Column(nullable=true)
public String getAddress() {
return this.address;
}
public void setAddress(String address) {
this.address = address;
}
}
3,实体操作实例
package huizhi.sessionbean; import java.util.List; import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query; @Stateless
@Remote(UserDao.class)
public class UserDaobean implements UserDao {
@PersistenceContext(unitName= "EJBUserPU ") protected EntityManager em;
public void deleteUser(int userid) {
User user=em.find(User.class, userid);
if(user!=null) em.remove(user);
} public User getUserByID(int userid) {
return em.find(User.class, userid);
} @SuppressWarnings( "unchecked ")
public List <User> getUserList() {
Query query=em.createQuery( "select o from User o order by o.id asc ");
return (List <User> )query.getResultList();
} public void insertUser(User user) {
em.persist(user); } public void mergeUser(User user) {
em.merge(user); } public void updateName(String newname, int userid) {
User user=em.find(User.class, userid);
if(user!=null) user.setName(newname);
} }
4,jsp测试页面
<%@ page language= "java " import= "java.util.* " pageEncoding= "ISO-8859-1 "%>
<%@ page import= "huizhi.sessionbean.*,javax.naming.*,java.util.List " %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+ ":// "+request.getServerName()+ ": "+request.getServerPort()+path+ "/ ";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN ">
<html>
<head>
<base href= " <%=basePath%> ">
<title> My JSP 'index.jsp ' starting page </title>
<meta http-equiv= "pragma " content= "no-cache ">
<meta http-equiv= "cache-control " content= "no-cache ">
<meta http-equiv= "expires " content= "0 ">
<meta http-equiv= "keywords " content= "keyword1,keyword2,keyword3 ">
<meta http-equiv= "description " content= "This is my page ">
<!--
<link rel= "stylesheet " type= "text/css " href= "styles.css ">
-->
</head>
<body>
<table width= "80% " border= "1 ">
<tr bgcolor= "#DFDFDF ">
<td> id </td>
<td> name </td>
<td> age </td>
<td> phone </td>
<td> address </td>
</tr>
<%
try{
InitialContext ctx = new InitialContext();
UserDao userdao=(UserDao)ctx.lookup( "UserDaobean/remote ");
userdao.updateName( "lili ",1);
List <User> users = userdao.getUserList();
for(User user:users){
out.println( " <tr> <td> "+user.getId()+ " </td> <td> "+user.getName()+ " </td> <td> "+user.getAge()+ " </td> <td> "+user.getPhone()+ " </td> <td> "+user.getAddress()+ " </td> </tr> ");
}
}catch(Exception e){
out.println(e);
}
%>
</table>
</body>
</html>
最后是报错信息:
16:39:45,515 INFO [STDOUT] Hibernate:
select
user0_.id as id4_0_,
user0_.address as address4_0_,
user0_.age as age4_0_,
user0_.name as name4_0_,
user0_.phone as phone4_0_
from
user_zxl user0_
where
user0_.id=?
16:39:45,515 WARN [JDBCExceptionReporter] SQL Error: 942, SQLState: 42000
16:39:45,515 ERROR [JDBCExceptionReporter] ORA-00942: 表或视图不存在 16:31:37,546 INFO [STDOUT] Hibernate:
select
user0_.id as id2_0_,
user0_.address as address2_0_,
user0_.age as age2_0_,
user0_.name as name2_0_,
user0_.phone as phone2_0_
from
"user_zxl " user0_
where
user0_.id=?
16:31:37,562 WARN [JDBCExceptionReporter] SQL Error: 904, SQLState: 42000
16:31:37,562 ERROR [JDBCExceptionReporter] ORA-00904: "USER0_ ". "ID ": 标识符无效 据我自己所知,oracle数据库的查询语名中的字段名和表名是要加双引号的,例如,select "name " from "user_zxl ";可是用ejb连接的时候,那些语句是自动生成的,请问大虾们要怎么解决啊,这个问题困扰了我好久。
2.表建在哪个schema下面了?该schema是否和DefaultOracleDS中设置的登陆用户名相同?
就是在system下面,用户名密码都相同的