有一个结构。我想以这种方式链接这三个实体:公司应包含ID,公司名称和部门列表,每个部门都有一个工人列表,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
我试图与一对多和多对一建立联系,但未成功。
公司
@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>();
部
@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>();
工人
@Entity public class Worker { @Id @GeneratedValue(strategy = GenerationType.AUTO) private int idWorker; private String workerName; @ManyToOne @JoinColumn(name="idDepartment")
我从开始:
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();
它填充公司,但不填充其他表,也没有创建任何联接(映射)错误:
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 (?)
除了Glenn Lane的答案中提到的级联,您还需要了解双向关联是如何工作的。
它们有一个所有者方面和一个相反方面。JPA只关心所有者方面,以决定实体之间存在哪个关联。该业主方是一个 不 具备的mappedBy属性。
mappedBy
您的代码为公司增加了部门,为部门增加了工人,但是仅初始化了相反的方面。您忘记了初始化所有者方:
worker1.setDepartment(department); worker2.setDepartment(department); ... department.setCompany(company);