java - 在rest api中向spring boot多对多关系添加数据
问题描述
我是为简单的 rest api 创建的代码,我配置了与两个实体类的多对多关系,我想知道如何编写 addContract 方法并同时填充其相关的房间和 contractroom 表下面是我的代码,我需要一些帮助,请
合同类
@Entity
@Table(name = "T475_Contract")
public class Contract implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "contractId")
private long contractId;
@Column(name="start_date")
private Date st_date;
@Column(name="end_date")
private Date end_date;
@ManyToOne(fetch = FetchType.EAGER, optional = false)
@JoinColumn(name = "hotel_id", nullable = false)
@OnDelete(action = OnDeleteAction.CASCADE)
/*@JsonIgnore*/
private Hotel hotel;
@OneToMany(
mappedBy = "contract",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<ContractRoom> rooms = new ArrayList<>();
public Contract(){}
public Contract(Date st_date, Date end_date) {
this.st_date = st_date;
this.end_date = end_date;
}
//getters and setters
public void addRoom(Room room, int roomCount, double roomPrice){
ContractRoom contractRoom = new ContractRoom(this,room, roomCount, roomPrice);
rooms.add(contractRoom);
room.getContracts().add(contractRoom);
}
public void removeRoom(Room room){
for(Iterator<ContractRoom> iterator = rooms.iterator();
iterator.hasNext();
){
ContractRoom contractRoom = iterator.next();
if(contractRoom.getContract().equals(this) && contractRoom.getRoom().equals(room)){
iterator.remove();
contractRoom.getRoom().getContracts().remove(contractRoom);
contractRoom.setContract(null);
contractRoom.setRoom(null);
}
}
}
}
我的房间课
@Entity
@Table(name="T475_Room")
@NaturalIdCache
@Cache(
usage = CacheConcurrencyStrategy.READ_WRITE
)
public class Room implements Serializable {
@Id
@NaturalId
@Column(name="room_type")
private String room_type;
@Column(name="max_adults")
private int max_adults;
/*@Column(name="room_count")
private int room_count;
@Column(name="room_price")
private double room_price;*/
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "hotel_id", nullable = false)
@OnDelete(action = OnDeleteAction.CASCADE)
/*@JsonIgnore*/
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
private Hotel hotel;
@OneToMany(
mappedBy = "room",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<ContractRoom> contracts = new ArrayList<>();
public Room(){}
public Room(String room_type, int max_adults) {
this.room_type = room_type;
this.max_adults = max_adults;
}
}
我的 ContractRoom 课程
@Entity
@Table(name = "T475_ContractRoom")
public class ContractRoom {
@EmbeddedId
private ContractRoomId id;
@ManyToOne(fetch = FetchType.LAZY)
@MapsId("contractId")
private Contract contract;
@ManyToOne(fetch = FetchType.LAZY)
@MapsId("room_type")
private Room room;
@Column(name="room_count")
private int room_count;
@Column(name="room_price")
private double room_price;
private ContractRoom() {}
public ContractRoom(Contract contract, Room room, int room_count, double room_price) {
this.contract = contract;
this.room = room;
this.room_count = room_count;
this.room_price = room_price;
this.id = new ContractRoomId(contract.getContractId(),room.getRoom_type());
}
//Getters and setters
}
我想用服务类中的相关contractRoom和房间对象编写将合同保存在数据库中的方法,我该怎么写?
解决方案
您必须创建一个 Contracts 存储库,在服务类中声明它并使用.save(contract)
spring 数据中的方法。
推荐阅读
- eclipse - Eclipse Tycho:使用 java.xml.bind 模块时出现编译错误?
- c# - 在 wpf 中显示另一天取决于星期几
- angular - Angular CLI 使用 SASS 生成库
- javascript - 如何在 ngFor 中动态突出显示文本
- ssl - mosquitto 自签名证书问题 - 握手失败
- html - 多行缩进文本之前的css背景图像
- cordova - 在cordova插件中既没有调用成功回调也没有调用错误回调
- java - 找不到 RuntimeBuiltinLeafInfoImpl 但它的 jar 已添加到 pom.xml
- java - 带有数字值标记器的弹性字段映射,并且必须通过 Java api 执行
- python - 如何使用 Python 在 Selenium 中同时运行多个 webdriver 进程?