JPA:在GAE上创建多个父,单子关系

时间:2014-02-15 04:49:41

标签: java google-app-engine servlets google-cloud-datastore jpa-2.0

首先,我是DB的新手,所以如果这是一个愚蠢的问题,请在答案中有一点宽容和慷慨的细节,并感谢任何努力帮助!!

我无法为我的代码设计类结构,并欢迎任何有关此事的建议。我有3个数据类

1)学校

2)老师

3)研讨会

学校实体有List<Teacher>List<Workshop>他们托管。

研讨会实体拥有一个主办学校实体和List<Teacher>个参与者。

教师实体有一个List<Workshop>他们就读并且有一份工作经历List<School>(在下面的代码中没有显示学校列表,因为我要留下它直到稍后我先想出更简单的事情,但是目标)

给定城市中的每所学校都将被分配一个条目,而不是更多,教师和工作室的其他所有内容都必须引用该单个条目。

特定城市的每位教师都会在入学/帐户中被分配而不再被分配,所以其他一切都必须参考它

我知道我可以使用ID,但这将涉及大量的重复,我将无法从另一个对象中获取对象,该条目将是一个长的,即使我制作方法来自动化整个事物,这会非常快地耗尽我的查询配额(真的很想避免这种情况)

我希望能够查询单个实体(学校或教师或工作室),并能够查看所有其他实体列表。

另外, 教师四处走动,所以我必须能够从一所学校中移除教师(作为儿童实体)并将其添加到另一所学校,同时保留哪所学校主办其以前的工作坊的记录。

我自己做了很多

@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}

目前,我可以为特定的学校实体分配尽可能多的教师和研讨会,但是,我无法将教师实体(已经分配到学校 - 这里的关键点)分配给研讨会。这是我总是得到的错误

检测到尝试建立工作坊(no-id-yet)作为学校的家长(6148469022523392)/老师(5585519069102080),但学校(6148469022523392)/老师(5585519069102080)确定的实体已经是学校的孩子(6148469022523392) )。一旦对象被持久化,就无法建立或更改父级。

其顺序取决于创建和保留的实体。

非常感谢并等待任何建议和咨询......我不是在寻找一个完整的解决方案,我只是需要有人指出如何做到这一点(我确信我不是第一个被困在这里的人而且我我相信慷慨的专家会帮忙吗?

1 个答案:

答案 0 :(得分:0)

现在看,我有一些观点:你有三个成员:学校,工作室,老师。 学校有一个男人 - 车间和工作室老师。因此,一旦我们坚持上学,我们将在两个表格中都有参赛作品 - 工作坊和工作室。老师。你也希望一个工作室实体有一个主持学校所以我们也按照下面的代码保持这一点。

您的学校实体:

@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和amp;之间有ManyToMany。老师。在你的案例中,工作坊有教师名单,教师也有工作坊名单。所以在这里你需要一个加入表来解决这个ManyToMany关系。同样,在教师和教师之间学校你有ManyToMany,因为两者都有一个列表。所以在这里你也需要加入表。要了解更多关于这个点击here。 因此,要设置此ManyToMany关系,您必须通过连接表链接,而不是通过在此处保持,因为它将发生冲突。如果您想按照ManyToMany关系获取数据,那么您可以进行单独的查询。 希望这有帮助!