我是休眠的初学者,目前正在开发小型运输应用程序,其中集成了休眠的ORM工具以保存数据,现在我被困在一个基于一对一和一对一的关联进行映射的地方-太多。我有两个分别称为CompanyDetails
和DriverDetail
的实体。根据现实世界的情况,任何提供运输服务的公司都有很多drivers
及其详细信息,因此,我得出CompanyDetails
和DriverDetail
之间一对多的关联即公司有驱动程序列表。现在,这在数据库中为每个实体创建了三个表,第二个表是Company_detail
,driver_detail
和company-driver_detail
的映射表
场景
管理员用户将在公司中注册驱动程序,假设有10家公司,并且管理员想添加驱动程序,因此他可以代表任何公司ID注册驱动程序,我需要映射公司ID和company-driver_detail
表中的驱动程序。我所做的是,在List<DriverDetail> driverList
中使用属性CompanyDetail
,在CompanyDetail companyDetail
类中使用DriverDetail
。
公司详细信息
@Entity
@Table(name="company_detail")
//@DynamicUpdate
//@SelectBeforeUpdate
public class CompanyDetails {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="company_id")
private long companyId;
@OneToMany(cascade = CascadeType.ALL)
@LazyCollection(LazyCollectionOption.FALSE)
@JoinTable(name = "COMPANY_DRIVER_DETAIL", joinColumns = @JoinColumn(name = "company_id"), inverseJoinColumns = @JoinColumn(name = "driver_id"))
private List<DriverDetail> driverList;
//More properties
//Getters and Setters
}
DriverDetail
@Entity
public class DriverDetail {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="driver_id")
private long id;
private String name;
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="company_id")
private CompanyDetails companyDetail;
//More properties
//Getters and Setters
}
问题
当我向用户询问驾驶员信息时,我也想要company Id
,因此各个信息不仅保留在driver_detail
以及company-driver
表中,而且问题出在我询问company_id输入并在companyId
的设置器中设置CompanyDetail
,然后休眠更新company_detail
表内的所有字段,并且与id对应的整个行也将变为NULL
。
尝试的解决方案
我尝试代表companyId
获取所有记录,但是在这种情况下,company-driver
表中没有映射的数据。
我尝试使用注解@DynamicUpdate
和@SelectBeforeUpdate
,但没有遇到同样的问题。
要求
我想将驱动程序信息存储在driverdetail表以及company-driver_detail
表中,而不会丢失Company_detail
主要测试班
CompanyDetailService cdService=new CompanyDetailService();
CompanyDetails cd=new CompanyDetails();
List<DriverDetail>ddList=new ArrayList<>();
DriverDetail driver=new DriverDetail();
DriverDetailService dds=new DriverDetailService();
Scanner kb=new Scanner(System.in);
System.out.println("Enter name:");
String cname=kb.nextLine();
driver.setName(cname);
System.out.println("Enter Company Id");
long companyId=kb.nextLong();
cd.setCompanyId(companyId); //This line let hibernate to trigger update
System.out.println("Enter License:");
String license=kb.next();
driver.setLicenseNo(license);
System.out.println("Enter Contact");
String contact=kb.nextLine();
driver.setContactNo(contact);
cd.setDriverList(ddList);
driver.setCompanyDetail(cd);
dds.save(driver);
请帮助我克服这个问题