Я пытаюсь вставить сущность Song в БД ( Song имеет ассоциацию ManyToOne с Album ).
Проблема, с которой я сталкиваюсь, заключается в том, что когда я вставляю, например, 2 песни с одним и тем же альбомом, Hibernate дважды вставляет альбом в БД (с разными идентификаторами).
Я хотел бы знать, как лучше всего создать только один альбом.
(Я сохраняю «Song» с помощью класса SongRepository, расширяет JpaRepository простым методом «save»)
спасибо за помощь
Контроллер:
@RequestMapping(value = "/api")
public class SongController {
@Autowired
private SongService songService;
@PostMapping(value = "/song")
public ResponseEntity<Void> add(@RequestBody Song song) {
songService.add(song);
HttpHeaders headers = new HttpHeaders();
return new ResponseEntity<Void>(headers, HttpStatus.CREATED);
}
SongService
@Service
public class SongServiceImpl implements SongService {
@Autowired
private SongRepository songRepository;
@Transactional
@Override
public Song add(Song song){
return songRepository.save(song);
}
Repository:
public interface SongRepository extends JpaRepository<Song, Long> {
Song save(Song song);
}
@Entity
@Table(name = "SONGS")
@XmlRootElement
@XmlType(propOrder={"num", "name", "rate", "album"})
public class Song implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "id", updatable = false, nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Column(name = "NUMBER")
private int num;
@Column(name = "NAME")
private String name;
@Column(name = "RATE")
private int rate;
@ManyToOne(cascade=CascadeType.ALL,fetch = FetchType.LAZY)
@JoinColumn(name="ALBUM", referencedColumnName="ID", foreignKey=@ForeignKey(name="ALBUM"))
private Album album;
}
@Entity
@Table(name = "ALBUMS")
@XmlRootElement
@XmlType(propOrder={"name", "year"})
public class Album implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "ID", updatable = false, nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Column(name = "NAME")
private String name;
@Column(name = "YEAR")
private int year;
}