【发布时间】:2010-10-27 03:14:31
【问题描述】:
我有以下多对多映射:
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;
}
公共类猫实现 { @ID @GeneratedValue 私有整数 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(); 学生 s = new Student(); 学生 s2 = new Student(); 猫 c = 新猫(); 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);
如果( c != null ) System.out.println(c.getYID() + ":" + c.getStudents()); 如果(小号!=空) 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) 应该返回一个带有一组 {1,2} 的学生对象getCats() 的 {3}。
有什么办法可以做到吗?
谢谢, B.J.
【问题讨论】:
-
您是手动滚动实体对象还是生成它们?应该为您的子对象设置设置器(例如 Cat 类中的 .setStudents() )。
-
隐含了 getter 和 setter。我把它们放进去,我只是不想占用房间。我的代码编译并运行,但它并没有达到我的预期。
标签: java jpa persistence eclipselink entitymanager