java - JPA : Create multiple parent, GAE 上的独生子女关系

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

首先,我是一个数据库新手,所以如果这是一个愚蠢的问题,请对您的答案中的详细信息保持宽容和慷慨,并非常感谢您为提供帮助而付出的任何努力!!

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

1) 学校

2)老师

3)研讨会

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

一个研讨会实体有一个主办学校实体和一个 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}

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

检测到尝试将 Workshop(no-id-yet) 建立为 School(6148469022523392)/Teacher(5585519069102080) 的父级,但由 School(6148469022523392)/Teacher(5585519069102080) 识别的实体已经是 School(6148469) 的子级022523392 )。一旦对象被持久化,就无法建立或更改父对象。

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

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

最佳答案

现在看我有一些观点:你有三个实体:学校、工作室、老师。 学校有一个Tomany - 工作室和老师。因此,一旦我们坚持学校,我们就会在两个表中都有条目 - 研讨会和教师。而且您还希望研讨会实体有一个主办学校,所以我们在坚持的同时也实现了这一点下面的代码。

您的学校实体:

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

您的工作室实体:

@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 和 Teacher 之间存在 ManyToMany。正如您的情况,研讨会有教师列表,教师也有研讨会列表。所以在这里您将需要一个连接表来连接这个多对多关系。同样,在老师和学校之间,您有ManyToMany,因为两者都有彼此的列表。因此,您在这里也需要加入表。要了解有关此内容的更多信息,请单击here 。 因此,要设置此多对多关系,您必须通过连接表进行链接,而不是通过保留在此处,因为这样会发生冲突。如果您想根据此多对多关系获取数据,那么您必须进行单独的查询。 希望这有帮助!

关于java - JPA : Create multiple parent, GAE 上的独生子女关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21793532/

相关文章:

java - 从 servlet 转发到 servlet

java - 从firebase数据库获取数据时的同步问题

google-app-engine - 在开发中的数据存储查看器中运行 GAE GQL

google-app-engine - 使用带有 GAE 的 GWT-TestCase 测试 RPC 调用的示例

html - 为什么我需要在这个 Java Servlet 中将内容类型设置为 html?

java - 多部分/表单数据表单提交

java - 递归,计算正整数之和

java - Android BLE发送数据

java - if 语句满足后执行 else 语句

google-app-engine - Google App Engine 上的 SSL 证书无法正常工作