无法为实体设置 ManyToOne OneToMany,具有双重持久性
Can't set ManyToOne OneToMany for entities, have double persistance
@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。
抱歉,我知道这应该很简单,但就我而言,我做错了什么。
谢谢!
- 您应该将
cascade=CascadeType.ALL
移动到您协会的 @OneToMany
一侧:
@OneToMany(mappedBy = "Room", fetch = FetchType.EAGER, cascade=CascadeType.ALL)
private List<SponsorStart> sponsorsStart = new ArrayList<>();
- 您应该同步双向关联的两端:
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。
@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。 抱歉,我知道这应该很简单,但就我而言,我做错了什么。 谢谢!
- 您应该将
cascade=CascadeType.ALL
移动到您协会的@OneToMany
一侧:
@OneToMany(mappedBy = "Room", fetch = FetchType.EAGER, cascade=CascadeType.ALL)
private List<SponsorStart> sponsorsStart = new ArrayList<>();
- 您应该同步双向关联的两端:
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。