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

了解注释和JPA(hibernate)

万俟旭
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的答案中提到的级联,您还需要了解双向关联是如何工作的。 它们有一个所

  • 问题内容: 这是有关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中声明注释的语法有点尴尬。它们看起来有点像接口(毕竟是用声明的),但它们并不是真正的接口

  • 关于注释和注释,我遇到了一个有趣的问题在Spring Boot项目上,spring data jpa也在项目中。 基本上,我有软删除机制,这是为实体设置一个有效的日期(例如属性列在实体类中带有属性)。这些实体用注释类似于。这样,将设置为now和before的软删除的实体自动删除。(例如实体类) 我还有一些其他实体没有(例如实体类) 以及其他一些可用的表。如果是Jpa查询带注释的方法。我正面临着一些

  • 我想知道是否可以将hibernate注释,尤其是那些类级注释,与QueryDsl中的标准JPA注释结合起来。像这样... 目前我们只使用JPA注释,但是我们也必须加入一些hibernate注释。 在 apt 插件配置中将“JPA 注释处理器”替换为“Hibernate注释处理器”是否安全?*) *)然而,在将注释处理器替换为“HibernateAnnotationProcessor”之后,我没有注