Java 使用更新子表休眠一对多关系

Java 使用更新子表休眠一对多关系,java,hibernate,Java,Hibernate,我有两个名为OwnerDetails和VehicleDetails的pojo类,如下所示 @Entity public class OwnerDetails implements Serializable{ private static final long serialVersionUID = 1L; @Id @Column(name="Owner_id") private int id; @Column(name="owner_name")

我有两个名为
OwnerDetails
VehicleDetails
的pojo类,如下所示

@Entity
public class OwnerDetails implements Serializable{


    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="Owner_id")
    private int id;
    @Column(name="owner_name")
    private String ownerName;
    @Column(name="email_id")
    private String email;
    @Column(name="mobile")
    private String mobile;
    @Column(name="land_line")
    private String phone;
    @Column(name="Mailing_Address")
    private String mailing_address;

    @OneToMany(mappedBy="ownerDetails", cascade=CascadeType.ALL)
    private Set<VehicleDetails> vehicleDetails;
    // getter & Setter...

}

@Entity
public class VehicleDetails implements Serializable{


    private static final long serialVersionUID = 1L;


    @Id
    private int v_id;
    @Column(name="TYPE")
    private String type;
    @Column(name="AC_OR_NON_AC")
    private boolean aircondition;
    @Column(name="SEATING_CAPACITY")
    private int seatingCapacity;
    @Column(name="FUEL_TYPE")
    private String fuel_type;
    @Column(name="Reg_number")
    private String reg_number;

    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="Owner_id")
    private OwnerDetails ownerDetails;
// getter & Setter....

}
@实体
公共类OwnerDetails实现了可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@列(name=“Owner\u id”)
私有int-id;
@列(name=“owner\u name”)
私有字符串所有者名称;
@列(name=“email\u id”)
私人字符串电子邮件;
@列(name=“mobile”)
私有字符串移动;
@列(name=“land\u line”)
私人电话;
@列(name=“邮寄地址”)
专用字符串邮寄地址;
@OneToMany(mappedBy=“ownerDetails”,cascade=CascadeType.ALL)
私家车详情;
//盖特和塞特。。。
}
@实体
公共类VehicleDetails实现可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
私人内部身份证;
@列(name=“TYPE”)
私有字符串类型;
@列(name=“AC\u或非AC”)
私人空调;
@列(名称=“座位容量”)
私人国际座位容量;
@列(name=“燃料类型”)
专用管柱式燃油泵;
@列(name=“注册号”)
私有字符串注册号;
@多通(级联=级联类型.ALL)
@JoinColumn(name=“Owner\u id”)
私人所有者详细信息;
//盖特和塞特。。。。
}
主要节目是

public static void main(String[] args) throws InterruptedException {


        SessionFactory sf=getSessionFactory();
        Session session=sf.getCurrentSession();
        Transaction txn=session.beginTransaction();

        OwnerDetails own=(OwnerDetails)session.get(OwnerDetails.class, 1);

        Set<VehicleDetails> vhSet=new HashSet<VehicleDetails>();
        VehicleDetails vh=new VehicleDetails();
        vh.setAircondition(true);
        vh.setFuel_type("DIESEL");
        vh.setReg_number("TN32 AA 5555");
        vh.setSeatingCapacity(12);
        vh.setV_id(11);
        vh.setType("INNOVA");
        vh.setOwnerDetails(own);
        vhSet.add(vh);

        own.setVehicleDetails(vhSet);

         session.saveOrUpdate(own);
         txn.commit();

    }
publicstaticvoidmain(String[]args)抛出InterruptedException{
SessionFactory sf=getSessionFactory();
Session Session=sf.getCurrentSession();
事务txn=session.beginTransaction();
OwnerDetails own=(OwnerDetails)session.get(OwnerDetails.class,1);
Set vhSet=新HashSet();
车辆详情vh=新车辆详情();
vh.设置空调(真实);
vh.setFuel_型(“柴油机”);
vh.setReg_编号(“TN32 AA 5555”);
vh.设置存储容量(12);
vh.setV_id(11);
vh.setType(“INNOVA”);
vh.设置所有者详细信息(自有);
添加(vh);
自有车辆详细信息(vhSet);
session.saveOrUpdate(自己的);
提交();
}
我遇到的问题发生在成功保存所有者详细信息和车辆详细信息后,没有任何问题

但我需要用相同的所有者详细信息再添加一个VihicledDetails。它使用ownerid更新当前vihicledetails实例,并使用null ownerid更新vihicledetails中的现有行

请查看下表


看起来像语句
own.setVehicleDetails(vhSet)导致车辆详细信息集仅替换为新的车辆详细信息集。而是使用
own.getVehicleDetails().add(vh)
。这将把新的vehicleDetails实体添加到与ownerDetails关联的现有vehicleDetails集合中,而不是替换它。

在vehicleDetails中,从“@manytone”符号中删除“cascade=cascadeType.All”。