首先,我一般是DB的新手,所以如果这真是一个愚蠢的问题,请您对我们的回答的细节有所宽容和慷慨,并非常感谢您所做的一切努力!

我在为代码设计类结构时遇到了麻烦,欢迎您提出任何有关此问题的建议。我有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}


目前,我可以为一个特定的School实体分配尽可能多的教师和工作坊,但是,我不能为一个Workshop分配教师实体(已经分配给School-这里的关键点)。这是我总是会得到的错误

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

顺序取决于创建和持久保存的实体。

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

最佳答案

现在看,我有几点:您拥有的三个实体:学校,工作室,老师。
学校有一对多-车间和老师。因此,一旦我们坚持学习,我们将在两个表中都输入项目-Workshop和Teacher。并且您还希望有一个Workshop实体拥有一所寄宿学校,因此我们还可以按照以下代码进行持久化。

您的学校实体:

@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实体也有一个参与者列表。一个Teacher实体有一个他们参加的列表和一个工作历史列表。这表明您在Workshop和Teacher之间有ManyToMany。就像您的情况一样,Workshop有教师列表,而Teachers也有Workshop列表。因此,在这里您将需要一个联接表来确定ManyToMany关系。同样,在老师和学校之间,您有ManyToMany,因为两者都具有彼此的列表。因此,在这里您还需要加入表格。要了解更多信息,请单击here
因此,要设置此ManyToMany关系,您必须通过联接表进行链接,而不必在此处保持存在,因为那样会发生冲突。而且,如果您要按照ManyToMany关系获取数据,则需要进行单独的查询。
希望对您有所帮助!

10-08 13:37