有一个结构.我想以这种方式链接这三个实体:公司应该包含id,公司名称和部门列表,每个部门都有一个Worker列表,id和部门名称.每个工人都有名字,身份证.
+Company
-int companyId
-String companyName
-Set<Department> listOfDepartments = new HashSet<Department>();
+Department
-int departmentId
-String departmentName
-Set<Worker> listOfWorkers = new HashSet<Worker>();
+Worker
-int workerId
-String workerName
Run Code Online (Sandbox Code Playgroud)
我尝试与一对多和多对一建立连接,但是没有成功.
Сompany
@Entity
@Table(name="Company")
public class Company {
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private int idCompany;
private String companyName;
@OneToMany(mappedBy = "company")
private Set<Department> listOfDepartments = new HashSet<Department>();
Run Code Online (Sandbox Code Playgroud)
部门
@Entity
public class Department {
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private int idDepartment;
private String departmentName;
@ManyToOne
@JoinColumn(name="idCompany")
private Company company;
@OneToMany(mappedBy = "department")
private Set<Worker> listOfWorkers = new HashSet<Worker>();
Run Code Online (Sandbox Code Playgroud)
工人
@Entity
public class Worker {
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private int idWorker;
private String workerName;
@ManyToOne
@JoinColumn(name="idDepartment")
Run Code Online (Sandbox Code Playgroud)
我开始:
Session session = sessionFactory.openSession();
session.beginTransaction();
Worker worker1 = new Worker("WorkerName1");
Worker worker2 = new Worker("WorkerName2");
Worker worker3 = new Worker("WorkerName3");
Worker worker4 = new Worker("WorkerName4");
Department department = new Department("Technical");
department.getListOfWorkers().add(worker1);
department.getListOfWorkers().add(worker2);
department.getListOfWorkers().add(worker3);
department.getListOfWorkers().add(worker4);
company = new Company("MyCompanyName");
company.getListOfDepartments().add(department);
session.save(company);
session.getTransaction().commit();
session.close();
Run Code Online (Sandbox Code Playgroud)
它填充公司,但没有填充其他表,也没有创建任何连接(映射)错误:
Hibernate: alter table Department drop foreign key FK_l7sg67atqhnn0soqynpvxrtpk
Hibernate: alter table Worker drop foreign key FK_s53hyohtyjy93srd2wkksairk
Hibernate: drop table if exists Company
Hibernate: drop table if exists Department
Hibernate: drop table if exists Worker
Hibernate: create table Company (idCompany integer not null auto_increment, companyName varchar(255), primary key (idCompany))
Hibernate: create table Department (idDepartment integer not null auto_increment, departmentName varchar(255), idCompany integer, primary key (idDepartment))
Hibernate: create table Worker (idWorker integer not null auto_increment, workerName varchar(255), idDepartment integer, primary key (idWorker))
Hibernate: alter table Department add index FK_l7sg67atqhnn0soqynpvxrtpk (idCompany), add constraint FK_l7sg67atqhnn0soqynpvxrtpk foreign key (idCompany) references Company (idCompany)
Hibernate: alter table Worker add index FK_s53hyohtyjy93srd2wkksairk (idDepartment), add constraint FK_s53hyohtyjy93srd2wkksairk foreign key (idDepartment) references Department (idDepartment)
??? 11, 2013 3:10:31 AM org.hibernate.tool.hbm2ddl.SchemaExport execute
INFO: HHH000230: Schema export complete
Hibernate: insert into Company (companyName) values (?)
Run Code Online (Sandbox Code Playgroud)
除了Glenn Lane的答案中提到的级联之外,您还需要了解双向关联的工作原理.
他们有业主方面,反面.JPA只关心所有者方来决定实体之间存在哪种关联.该业主方是一个不具备的mappedBy属性.
您的代码会向公司添加分类,向部门添加工作人员,但它只会初始化反面.您忘记初始化所有者方:
worker1.setDepartment(department);
worker2.setDepartment(department);
...
department.setCompany(company);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4662 次 |
| 最近记录: |