Как предотвратить двойные строки в БД с Hibernate - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь вставить сущность 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;
}

1 Ответ

0 голосов
/ 30 апреля 2018

Я бы заставил объект альбома иметь List<Song> с отношением @OneToMany. Присвойте объекту песни идентификатор альбома в качестве внешнего ключа. Затем вы можете вызвать сохранение в альбом за один раз, если вы используете AlbumRepository.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...