Java spring boot中用于持久化数据的多对多关系的JPA或CRUD存储库查询

Java spring boot中用于持久化数据的多对多关系的JPA或CRUD存储库查询,java,spring,hibernate,spring-boot,spring-data-jpa,Java,Spring,Hibernate,Spring Boot,Spring Data Jpa,我有3个实体城市、酒店和书房,地图如下所述: public class BookRoom { @Id @GeneratedValue(strategy = GenerationType.AUTO) private int bookID; ..... ..... @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumn(name ="hotelID") private Hot

我有3个实体城市、酒店和书房,地图如下所述:

public class BookRoom {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private int bookID;
  .....
  .....
  @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
  @JoinColumn(name ="hotelID")
  private Hotel hotel;
}  

public class Hotel {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Integer hotelID;
  ....
  ....
  @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
  @JoinTable(name = "Hotel_City", joinColumns = @JoinColumn(name = "hotelID", nullable = false), inverseJoinColumns = @JoinColumn(name = "cityID", nullable = false))
  private Set<City> cities;

  @OneToMany(fetch = FetchType.LAZY, mappedBy = "hotel")
  private Set<BookRoom> bookRoom;
}

public class City {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private int cityID;
  ....
  ....
  @ManyToMany(fetch = FetchType.LAZY, mappedBy = "cities")
  private Set<Hotel> hotels;
}
我的调用方法如下:

@Override
public void run(String... arg0) throws Exception {
    City city = new City();
    Hotel hotel = new Hotel();
    city.setCityID(4);
    Set<City> cities = new HashSet<>();
    cities.add(city);
    hotel.setCities(cities );
    hotel.setHotelID(2);

    BookRoom bookRoom = new BookRoom();
    bookRoom.setCheckInDate(new Date());
    bookRoom.setCheckOutDate(new Date());
    bookRoom.setCityN("Ranchi");
    bookRoom.setNoOfRooms(1);
    bookRoom.setHotel(hotel);
    bookRoom.setUserName("Aman");
    bookRoomRepo.save(bookRoom);
}
@覆盖
公共无效运行(字符串…arg0)引发异常{
城市=新城();
酒店=新酒店();
城市。设置城市ID(4);
Set cities=newhashset();
城市。添加(城市);
塞特城市酒店(城市);
塞特霍特利德酒店(2);
书房书房=新书房();
bookRoom.setCheckInDate(新日期());
bookRoom.setCheckOutDate(新日期());
书房:setCityN(“Ranchi”);
书房.书房(1);
书房。塞特酒店(酒店);
bookRoom.setUserName(“Aman”);
bookRoomRepo.save(bookRoom);
}
因此,我的问题是,在添加BookRoom详细信息时,它会尝试添加酒店和城市的记录,而不管数据是否存在。

尝试使用merge()方法,而不是save()方法。请参见

可能的副本
Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: com.hbs.entity.Hotel
@Override
public void run(String... arg0) throws Exception {
    City city = new City();
    Hotel hotel = new Hotel();
    city.setCityID(4);
    Set<City> cities = new HashSet<>();
    cities.add(city);
    hotel.setCities(cities );
    hotel.setHotelID(2);

    BookRoom bookRoom = new BookRoom();
    bookRoom.setCheckInDate(new Date());
    bookRoom.setCheckOutDate(new Date());
    bookRoom.setCityN("Ranchi");
    bookRoom.setNoOfRooms(1);
    bookRoom.setHotel(hotel);
    bookRoom.setUserName("Aman");
    bookRoomRepo.save(bookRoom);
}