Hibernate与更新子表的一对多关系

时间:2017-01-05 11:10:15

标签: java hibernate

我有两个名为OwnerDetails&的pojo类。 VehicleDetails,显示在下面

@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....

}

主程序是

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();

    }

我所拥有的问题发生在ownerdetails和vehicledetails成功保存后没有任何问题。

但是我需要添加一个带有相同ownerdtails的vihicledetails。它使用ownerid更新当前vihicledetails实例,并使用null ownerid更新vihicledetails中的现有行。

请查看下表。

enter image description here

1 个答案:

答案 0 :(得分:0)

看起来语句own.setVehicleDetails(vhSet);导致vehicleDetails设置为仅用新的替换。而是使用own.getVehicleDetails().add(vh)。这会将新的vehicleDetails实体添加到与ownerDetails相关联的现有vehicleDetails集,而不是替换它。