如何在不更新休眠状态的CompanyDetail的情况下保存DriverDetail

时间:2019-03-10 11:52:43

标签: java hibernate

我是休眠的初学者,目前正在开发小型运输应用程序,其中集成了休眠的ORM工具以保存数据,现在我被困在一个基于一对一和一对一的关联进行映射的地方-太多。我有两个分别称为CompanyDetailsDriverDetail的实体。根据现实世界的情况,任何提供运输服务的公司都有很多drivers及其详细信息,因此,我得出CompanyDetailsDriverDetail之间一对多的关联即公司有驱动程序列表。现在,这在数据库中为每个实体创建了三个表,第二个表是Company_detaildriver_detailcompany-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

尝试的解决方案

  1. 我尝试代表companyId获取所有记录,但是在这种情况下,company-driver表中没有映射的数据。

  2. 我尝试使用注解@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);

Company_detail Driver_detail Company_driver_detail

请帮助我克服这个问题

0 个答案:

没有答案