我有以下多对多映射:
public class Student implements
{
@Id
@GeneratedValue
private Integer xID;
@ManyToMany
@JoinTable(name = "x_y",
joinColumns = { @JoinColumn(name = "xID")},
inverseJoinColumns={@JoinColumn(name="yID")})
private Set<Cat> cats;
}
public class Cat implements
{
@Id
@GeneratedValue
private Integer yID;
@ManyToMany
@JoinTable(name = "x_y",
joinColumns = { @JoinColumn(name = "yID")},
inverseJoinColumns={@JoinColumn(name="xID")})
private Set<Student> students;
}
请忽略对象和属性名称,它们是虚构的和不相关的。这可以编译并正常工作。我也可以这样做:
Entitymanager em = emf.createEntityManager();
em.getTransaction().begin();
Student s = new Student();
Student s2 = new Student();
Cat c = new Cat();
em.persist(s);
em.persist(s2);
em.persist(c);
s.getCats().add(c);
c.getStudents().add(s2);
em.getTransaction().commit();
当我从数据库中取回对象时,我的问题就来了。
em.getTransaction().begin();
Student s = em.find(Student.class, 2);
Cat c = em.find(Cat.class, 3);
if( c != null )
System.out.println(c.getYID() + ": " + c.getStudents());
if( s != null )
System.out.println(s.getXID() + ": " + s.getCats());
em.getTransaction().commit();
打印输出是:
3:{IndirectSet:未实例化}
2:{IndirectSet:未实例化}
这很可能是正常行为。在我看来,当我从表中取回对象时,应该填充与其他对象相关的集合。我的意思是,因为连接表看起来像这样:
X | 是
2 | 3
1 | 3
em.find(Cat.class,3) 应该为 getStudents() 返回一个带有一组 {1,2} 的 Cat 对象,而 em.find(Student.class,2) 应该返回一个带有一组 {3 的 Student 对象} 对于 getCats()。
有没有办法让这成为可能?
谢谢, BJ