我用基于注释的方式测试了你的数据库结构,一切都很好。在你这边测试一下,看看你错过了什么:
孩子:
@Entity
@Table(name = "child")
@XmlRootElement
public class Child implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Size(max = 255)
@Column(name = "name")
private String name;
@JoinColumn(name = "idobject", referencedColumnName = "id")
@ManyToOne(fetch = FetchType.LAZY)
private entity.Object object;
public Child() {
}
public Child(Integer id) {
this.id = id;
}
//getter and setters
}
对象:
@Entity
@Table(name = "object")
@XmlRootElement
public class Object implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Size(max = 255)
@Column(name = "name")
private String name;
@OneToMany(mappedBy = "object", fetch = FetchType.LAZY)
private List<Child> children;
@JoinColumn(name = "idparent", referencedColumnName = "id")
@ManyToOne(fetch = FetchType.LAZY)
private Parent parent;
public Object() {
}
public Object(Integer id) {
this.id = id;
}
//getter and setter
}
家长:
@Entity
@Table(name = "parent")
@XmlRootElement
public class Parent implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Size(max = 255)
@Column(name = "name")
private String name;
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
private List<entity.Object> objects;
public Parent() {
}
public Parent(Integer id) {
this.id = id;
}
//getter and setters
}
和我的查询:
public class ObjectDao {
public static List<Object> getObjects() {
EntityManager em = Persistence.createEntityManagerFactory("test").createEntityManager();
try {
Query query = em.createQuery("SELECT o from Object o JOIN FETCH o.parent JOIN FETCH o.children");
List l = query.getResultList();
return l;
} catch (Exception ex) {
ex.printStackTrace();
return new ArrayList<Object>();
} finally {
em.close();
}
}
}
我用于调试的 servlet:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
List<entity.Object> objects = ObjectDao.getObjects();
for (entity.Object obj : objects) {
System.out.println("object name:" + obj.getName());
System.out.println("parent name:" + obj.getParent().getName());
List<Child> children = obj.getChildren();
System.out.println("children:");
for(Child c: children){
System.out.println(c.getName());
}
}
}
结果是:
object name:Object 1
parent name:Parent 1
children:
Child Name