首页 > 解决方案 > 在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和房间对象编写将合同保存在数据库中的方法,我该怎么写?

标签: javaspringrestspring-boot

解决方案


您必须创建一个 Contracts 存储库,在服务类中声明它并使用.save(contract)spring 数据中的方法。


推荐阅读