代码之家  ›  专栏  ›  技术社区  ›  a.atlam

JPA:在GAE上创建多父母、单子女关系

  •  1
  • a.atlam  · 技术社区  · 11 年前

    首先,我是一个新手,一般来说都是DB,所以如果这是一个愚蠢的问题,请在回答中对细节保持宽容和慷慨,并非常感谢您为帮助我所做的任何努力!!

    我在为我的代码设计类结构时遇到了困难,我欢迎任何关于这个问题的建议。我有3个数据类

    1) 学校

    2) 教师

    3) 车间

    学校实体拥有 List<Teacher> 和一个 List<Workshop> 他们主持。

    车间实体有一个单独的寄宿学校实体和一个 列表<教师> 与会者人数。

    教师实体具有 列表<研讨会> 他们参加了培训,并有就业史 List<School> (没有在下面的代码中显示学校列表,因为我将把它留到稍后,我会先考虑更简单的事情,但它是一个目标)

    给定城市中的每一所学校都将被分配一个条目,不再分配,教师和工作坊中的所有其他内容都必须参考该条目。

    给定城市中的每一位教师都将被分配入职/账户,不再分配,因此其他一切都必须参考

    我知道我可以使用ID,但这将涉及大量的重复,而且我无法从另一个对象中获取对象,条目将是一个Long,即使我使用方法来自动化整个过程,这也会很快耗尽我的查询配额(我真的很想避免这一点)

    我希望能够查询单个实体(学校、教师或车间),并能够查看所有其他相关的实体列表。

    加 教师四处流动,因此我必须能够从一所学校删除一名教师(作为一个儿童实体),并将其添加到另一所学校,同时保持之前举办研讨会的学校的记录。

    我自己做了这么多

    @Entity
    public class School 
    {
        @Id 
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long ID; 
    
        @OneToMany(cascade = CascadeType.ALL, mappedBy="school")
        private List<Teacher> teachers;
    
        @OneToMany(cascade = CascadeType.ALL,mappedBy="school")
        private List<Workshop> workshops;
    // Getters and Setters and some methods
        }
    
    
    
    @Entity
    public class Teacher 
    {
    
        @Id 
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Key key;
    
        @ManyToOne
        private School school;
    
        private List<Workshop> Workshops;
    // Getters and Setters and some methods}
    
    @Entity
    public class Workshop
    {  
        @Id 
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Key key;
        @ManyToOne
        private School school;
        private List<Teacher> Participants;
        // Getters and Setters and some methods}
    

    目前,我可以将尽可能多的教师和工作坊分配给特定的学校实体,但是,我无法将教师实体(已分配给学校-此处的关键点)分配给工作坊。这是我经常遇到的错误

    检测到试图以学校(6148469022523392)/教师(5585519069102080)的家长身份建立工作坊(暂无身份证),但学校(614842902252339)/老师(5585519029102082)认定的实体已经是学校(6148489022523390)的子女。一旦对象被持久化,就无法建立或更改父级。

    其顺序取决于首先创建和持久化的实体。

    非常感谢并等待任何建议和咨询。。。我不是在寻找一个完整的解决方案,我只需要有人指出如何做到这一点(我相信我不是第一个陷入困境的人,我相信慷慨的专家会帮助我)

    1 回复  |  直到 11 年前
        1
  •  0
  •   Vivek    11 年前

    现在看,我有几点:你有三个兴趣:学校,工作坊,老师。 学校有一个托马尼与车间&教师因此,一旦我们坚持上学,我们将在两个表中都有条目-工作坊和;老师。你也想 工作坊实体有一个单独的主办学校 所以我们在按照下面的代码进行持久化的同时也实现了这一点。

    您的学校实体:

    @Entity
    public class School 
    {
        @Id 
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long ID; 
    
        @OneToMany(cascade = CascadeType.PERSIST, mappedBy="school")
        private List<Teacher> teachers;
    
        @OneToMany(cascade = CascadeType.PERSIST,mappedBy="school")
        private List<Workshop> workshops;
    // Getters and Setters and some methods
        }
    

    您的教师实体:

    @Entity
    public class Teacher 
    {
    
        @Id 
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Key key;
    
         @ManyToOne(fetch=FetchType.LAZY)
         @JoinColumn(name="key")
        private School school;
    
        // Getters and Setters and some methods}
    

    您的WorkShop实体:

    @Entity
    public class Workshop
    {  
        @Id 
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Key key;
    
         @ManyToOne(fetch=FetchType.LAZY)
         @JoinColumn(name="key")
        private School school;
    

    然后:

        em.getTransaction().begin();
     School schoolObj = new School();
     schoolObj.setName("School 1");
     List <Teacher> teachers = new ArrayList<Teacher>();
     List <Workshop> workshopList = new ArrayList<Workshop>();
     Teacher teacher = new Teacher(); 
    teacher.setSchool(schoolObj);
     teacher.setName("Teacher 1");
     teachers.add(teacher);
    Teacher teacher1 = new Teacher();
     teacher1.setSchool(schoolObj); 
    teacher1.setName("Teacher 2"); 
    teachers.add(teacher1); 
    teacher teacher2 = new Teacher();
     teacher2.setSchool(schoolObj);
     teacher2.setName("Teacher 3");
     teachers.add(teacher2); 
    Workshop ws = new Workshop();
    ws.setSchool(schoolObj); //By this you setted schoolObj in workshop entity
    ws.set(some attribute);
    workshopList.add(ws);
    school.setTeachers(teachers); //By this you setted teachers through school ,i.e., entry came in teachers table too.
    school.setWorkshops(workshopList); //By this you setted workshopList through school ,i.e., entry came in workshop table too.
    em.persist(schoolObj); 
    em.getTransaction().commit();
     em.close();
    

    现在你提到:WorkShop实体也有参与者列表。教师实体有参与者列表和就业历史列表。这表明您在车间和车间之间有很多人;教师正如您的案例,Workshop有教师列表,而教师也有Workshop的列表。因此,在这里,您需要一个加入表来建立这种ManyToMany关系。类似地,教师与学生之间;学校你有ManyToMany,因为这两个学校都有彼此的列表。所以在这里你也需要加入表格。要了解更多信息,请单击 here . 因此,要设置此ManyToMany关系,必须通过连接表进行链接,而不是通过在此处进行持久化,因为这样会发生冲突。如果您想根据ManyToMany关系获取数据,那么您必须进行单独的查询。 希望这有帮助!