实体 bean 查询 异常,请高手帮个忙
0oops 2009-05-18 03:30:10 环境: JDK1.6 Eclipse3.4 JBOSS5.0
我建的普通的java 工程,将 jboss_home/client 下面的包全部导入
表 company(公司) , employee(员工) 一对多关系
实体 Company
@Entity
@Table(name = "Company")
public class Company implements Serializable {
/**
*
*/
private static final long serialVersionUID = -6665253756580566900L;
private Integer id;
private String name;
private Set<Employee> emps = new HashSet<Employee>();
public Company() {
super();
}
public Company(String name) {
super();
this.name = name;
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name = "Name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "name:" + this.name;
}
@OneToMany(mappedBy = "company", cascade = { CascadeType.ALL }, fetch = FetchType.EAGER)
public Set<Employee> getEmps() {
return emps;
}
public void setEmps(Set<Employee> emps) {
this.emps = emps;
}
}
实体 Employee
@Entity
@Table(name = "Employee")
public class Employee implements Serializable {
/**
*
*/
private static final long serialVersionUID = 6108196233317566600L;
private Integer id;
private String name;
private Company company;
public Employee() {
super();
}
public Employee(String name) {
super();
this.name = name;
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name = "Name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ManyToOne
@JoinColumn(name = "CID")
public Company getCompany() {
return company;
}
public void setCompany(Company company) {
this.company = company;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "name:" + this.name;
}
}
会话Bean
@Stateless
@Remote(CompanyManager.class)
public class CompanyManagerBean implements CompanyManager {
@PersistenceContext(unitName = "vod")
private EntityManager em;
@Override
public Company getCompanyById(Integer id) {
Company com = em.find(Company.class, id);
com.getEmps().size();
return com;
}
}
客户端
try {
CompanyManager cm = (CompanyManager) ctx
.lookup("vod-ejb-app/CompanyManagerBean/remote");
Company company = cm.getCompanyById(5);
System.out.println(com.getId());
} catch (Exception e) {
e.printStackTrace();
}
数据库有记录
报异常如下:
java.lang.reflect.UndeclaredThrowableException
at $Proxy7.getCompanyById(Unknown Source)
at junit.ejb.test.EJBTest.testTest(EJBTest.java:105)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66)
at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: java.lang.ClassNotFoundException: org.hibernate.collection.PersistentSet
补充说明
1. 数据库有记录
2. 经调试,在会话Bean 里面,查出来的com 不为null, 并且里面包含几个 Employee 对象
3. 如果会话bean 不返回值到客户端,就在里面直接用 com 对象,没有问题,一返回就报错
4. 如果把com 里面的 Employee 对象清除,就OK,可以自常返回,不报错,
这样写: Company com = em.find(Company.class, id);
com.setEmps(null);
return com;
5. 将 Hibernate3.jar 包放在 JBOSS_HOME/server/default/lib 里面,一样报错
6. 添加,修改,删除没有问题
我弄了好久,整不明白什么问题,很急,请高手帮个忙,十分感谢