当前位置: 首页 > 面试题库 >

了解注释和JPA(休眠)

宗弘扬
2023-03-14
问题内容

有一个结构。我想以这种方式链接这三个实体:公司应包含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属性。

您的代码为公司增加了部门,为部门增加了工人,但是仅初始化了反面。您忘记了初始化所有者方:

worker1.setDepartment(department);
worker2.setDepartment(department);
...
department.setCompany(company);


 类似资料:
  • 问题内容: 有一个结构。我想以这种方式链接这三个实体:公司应包含ID,公司名称和部门列表,每个部门都有一个工人列表,ID和部门名称。每个工人都有名字,身份证。 我试图与一对多和多对一建立联系,但未成功。 公司 部 工人 我从开始: 它填充公司,但不填充其他表,也没有创建任何联接(映射)错误: 问题答案: 除了Glenn Lane的答案中提到的级联,您还需要了解双向关联是如何工作的。 它们有一个所有

  • 问题内容: 如果您正在使用xml映射,那么liquibase是hibernate的 hbm2ddl_auto 属性的完美替代方案。但是我使用的是JPA注释(hibernate注释)。那么可以使用liquibase吗? 问题答案: 是的,Liquibase使用了hibernate的元数据类,无论您使用xml映射还是注释,它们都是相同的。您确实需要一个hibernate配置文件来指向liquibase

  • 问题内容: 这是有关JPA Transient批注的以下问题的后续解答 为什么JPA具有@Transient批注? 我有一个我不想保留的瞬态变量,并用瞬态注释标记。但是,当我想从我的rest控制器生成JSON时,此瞬态变量在输出的JSON中不可用。 POJO PublicationVO直截了当,没有花哨的属性,只有一些具有getter和setter和1个瞬态变量的私有属性(已保留)。 The Pu

  • 这是关于JPA瞬态注释的以下问题的后续问题,为什么JPA有@Transient注释? 我有一个我不想保留的瞬态变量,它被标记为瞬态注释。但是,当我想从我的rest控制器生成JSON时,这个瞬态变量在输出的JSON中不可用。 POJO PublicationVO是直截了当的,没有奇特的属性,只有一些私有属性(持久化的),带有getter和setter以及1个瞬态变量。 出版物VO如下 当我在日志中看

  • 问题内容: 我试图通过一些在线材料来学习Java中的注释。 在下面的代码,发生了什么事我亲爱的“Hello World”的字符串,我在这行通过:? 上面是定义的注释,下面是其用法 当我运行此代码时,它只是打印 请帮帮我,我完全不了解注释。 问题答案: 注释基本上是可以附加到字段,方法,类等的数据位。 在Java中声明注释的语法有点尴尬。它们看起来有点像接口(毕竟是用声明的),但它们并不是真正的接口

  • 问题内容: 我收到以下异常: 实体类头: 在hibernate.cfg.xml中: 在测试课程中: 我在没有注释的情况下进行了此工作(例如:在映射文件中使用映射),但是简单地使用JPA注释来声明映射似乎更直观-但我似乎无法使其正常工作。 我在这里做错了什么?我要做什么甚至有可能吗?看来我不是唯一遇到这种情况的人,请参阅:这里。 我正在使用hibernate3.5.6-FINAL FWIW。 TIA