1

Сначала я новичок с БД в целом, поэтому, если это окажется глупым вопросом, будьте немного терпимы и щедры с деталями в ур-ответ и спасибо за много любые усилия, чтобы помочь!JPA: Создайте несколько родительских отношений с одним ребенком на GAE

У меня возникли проблемы с созданием структуры классов для моего кода и приветствую любые предложения по этому вопросу. У меня есть 3 классов данных

1) Школа

2) Учитель

3) Мастерской

Школа Entity имеет List<Teacher> и List<Workshop> они организованы.

A Workshop Entity имеет единственную участвующую школьную организацию и List<Teacher> участников.

Учитель Entity был List<Workshop> они присутствовали и трудовой истории List<School> (не показывая школьный список в коде ниже, как я оставить его на потом, когда я понять простые вещи первой, но его цель)

Каждой школе в данном городе будет назначена одна запись, и не более того, все остальное от Учителя и Семинара должно ссылаться на эту единую запись. не

Каждый учитель в данном городе будут назначены на въезд/счет, и не больше, так что все остальное должно ссылаться на него

Я знаю, что я могу работать с идентификаторами, но будет включать в себя тонны дублирования и я не сможет получить объект из другого объекта, запись будет длинной, и даже если я создам методы для автоматизации всего этого, это очень быстро избавит мои квоты запросов (было бы очень интересно избежать этого)

Я хотел был бы иметь возможность запросить для одного сущности (школы или учителя или мастерской) и иметь возможность увидеть все другие связанные списки сущностей.

Плюс, Учителя передвигаются, поэтому я должен быть в состоянии удалить Учителя (как дочернюю организацию) из одной школы и добавить его в другую, сохранив при этом запись о том, какая школа проводила свои предыдущие семинары.

Я это много сделан по моему собственному

@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 (не-ID-пока) в качестве родителя школы (6148469022523392)/Учителя (5585519069102080), но лиц, идентифицированных школа (6148469022523392)/Учитель (5585519069102080) уже является ребенком школы (6148469022523392). Родитель не может быть установлен или изменен после сохранения объекта.

Порядок, который зависит от того, какой объект Entity был создан и сохранен первым.

Спасибо большое и ожидаю консультаций и консультаций ...Я не ищу полного решения, мне просто нужен кто-то, чтобы указать, как это можно сделать (я уверен, что я не первый, кто застрял здесь, и я уверен, что щедрые эксперты помогут)

ответ

2

Посмотрите, у меня есть несколько очков: Три Entites у вас есть: Школа, Мастерская, Учитель. Школа есть oneTomany с - мастерская & учитель. Поэтому, как только мы упорствуем в школе, у нас будут записи в обеих таблицах - мастерская & учитель. А также вы хотели иметь У организации-мастерства есть одна хост-школа, поэтому мы достигли этого и сохраняем, как показано ниже.

Ваша школа Entity:

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

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

@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 также есть список участников. У A Teacher Entity был список, в котором они участвовали, и список истории занятости. Это показывает, что у вас есть ManyToMany между Workshop & Учитель. Как и в вашем случае, на семинаре есть список учителей и учителей, также есть список семинаров. Здесь вам потребуется таблица для соединения, чтобы отладить эту связь ManyToMany. Точно так же между учителем & у вас есть ManyToMany, так как у обоих есть список других. Также здесь вам понадобится соединение таблицы. Чтобы узнать больше об этом, нажмите here. Следовательно, чтобы установить это отношение ManyToMany, вам нужно связать через таблицу соединений, не сохранившись здесь, так как тогда он столкнется. И если вы хотите получать данные в соответствии с этим отношением ManyToMany, то вы делаете отдельный запрос. Надеюсь, что эта помощь!

+0

Во-первых, Спасибо большое за ваш ответ ... Я попробовал почти все, что мог придумать, но все же застрял с ** Обнаружил попытку создать школу (6337585022500864) в качестве родителя школы (6337585022500864)/Мастерская (4930210138947584))/Учитель (6056110045790208), но субъект, идентифицированный Школой (6337585022500864)/Мастерская (4930210138947584)/Учитель (6056110045790208) уже является ребенком школы (6337585022500864)/Мастерская (4930210138947584). Родитель не может быть установлен или изменен после того, как объект был сохранен. ** –

+0

Я не совсем уверен, как это сделать, используя двунаправленные отношения. Моя проблема заключается в том, что я хочу, чтобы учитель был ребенком какой-то школы «Школа (6337585022500864)», но также был ребенком Семинара, организованного какой-то другой/той же школой «Школа» (6337585022500864)/Мастерская (4930210138947584)/Учитель (6056110045790208)) '... Это можно сделать легко с помощью базы данных ID и множества методов, однако я не смогу запросить значение свойства ANY, поскольку свойства будут только идентификаторами. Я отправлю код сервлета ниже –

+0

'em.getTransaction(). Begin(); Школьная школа = новая школа(); school.setName («Школа 1»); Список teachers = new ArrayList (); Преподаватель учителей = новый Учитель(); teacher.setName («Учитель 1»); teachers.add (учитель); Преподаватель учителей1 = новый Учитель(); teacher.setName («Учитель 2»); teachers.add (teacher1); учитель учитель2 = новый Учитель(); teacher.setName («Учитель 3»); \t \t учителей.добавить (teacher2); Мастерская ws = new Workshop(); ws.set Участники (преподаватели); \t \t school.setTeachers (преподаватели); Список wss = new ArrayList (); wss.add (ws); school.setWorkshops (wss); ' –

Смежные вопросы