不能为实体设置 ManyToOne OneToMany,具有双重持久性

问题描述

@Entity
public class Room {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToMany(mappedBy = "Room",fetch = FetchType.EAGER)
    private List<SponsorStart> sponsorsStart = new ArrayList<>();
//getters setters
@Entity
@Table(name = "sponsors_start")
public class SponsorStart {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @Column
    private String username;
    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name = "room_id")
    private Room Room;
@Repository
public interface RoomRepository extends CrudRepository<Room,Long> {

}

From RoomServiceImpl save:
  @Override
    public Room saveRoom(Room Room) {
        return roomRepository.save(Room);
    }

我的行为顺序是什么?

1. List<SponsorStart> sponsorStarts = new ArrayList<>();
2. Room room = new Room();
3. giveRoom.setSponsorsStart(sponsorStarts); //set list of sponsors form p.1
4. giveRoomService.saveRoom(room); //save room

而sponsors_start 数据库是空的。 我尝试先从列表中保存每个 sposorStart,但它们在 room_id 列中保存为 null。 抱歉,我知道这应该很简单,但就我而言,我做错了。 谢谢!

解决方法

  1. 您应该将 cascade=CascadeType.ALL 移到关联的 @OneToMany 一侧:
@OneToMany(mappedBy = "Room",fetch = FetchType.EAGER,cascade=CascadeType.ALL)
private List<SponsorStart> sponsorsStart = new ArrayList<>();
  1. 您应该同步双向关联的双方:
List<SponsorStart> sponsorStarts = new ArrayList<>();
SponsorStart sponsorStart1 = new SponsorStart();
sponsorStarts.add(sponsorStart1);
// ...

Room room = new Room();

// sync both side of the association
sponsorStart1.setRoom(room);
room.setSponsorsStart(sponsorStarts); //set list of sponsors form p.1
room.saveRoom(room); //save room

另请参阅 this part 的 hibernate 文档。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...