首先,我一般是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关系获取数据,则需要进行单独的查询。
希望对您有所帮助!