Spring 引导 JPA 保持多对多单向关系
Spring boot JPA persist manytomany unidirectionnal relationship
我有一个 Spring 引导项目(使用 JHipster),其中包含 2 个 JPA 实体:用户和电影。
我在它们之间创建了一个单向的多对多关系。
用户是关系的所有者。
我想将电影添加到用户(用户实体中的属性 'favorites')最喜欢的电影列表中。
但是当我尝试将电影添加到收藏夹列表时,table 'user_film_favorite' 中没有任何内容(在两个实体之间加入 table)。
映射似乎没问题,因为当我在此连接中手动输入数据时 table,我能够检索用户的电影列表。
我在这里找了很多类似的问题,但找不到问题所在。
实体用户:
@Entity
@Table(name = "jhi_user")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class User extends AbstractAuditingEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// Other properties
@ManyToMany(cascade = CascadeType.PERSIST)
@JoinTable(
name = "user_film_favorite",
joinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "id") },
inverseJoinColumns = { @JoinColumn(name = "movie_id", referencedColumnName = "id") }
)
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@BatchSize(size = 20)
private List<Film> favorites = new ArrayList<>();
实体片:
@Entity
@Table(name = "film")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Film implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@NotNull
@Column(name = "title", nullable = false)
private String title;
@Column(name = "plot")
private String plot;
@Column(name = "rating")
private Float rating;
电影服务:
/**
* Add one film to current user favorites.
*
* @param id the id of the film.
* @return the film saved into user favorites.
*/
@Transactional(readOnly = true)
public Optional<FilmDTO> addToFavorites(Long id) {
log.debug("Request to get Film : {}", id);
Optional<Film> filmOpt = filmRepository.findById(id);
// Get current logged user with his favorites
Optional<User> userOpt = userService.getUserWithFavorites();
if (filmOpt.isPresent() && userOpt.isPresent()) {
User user = userOpt.get();
user.getFavorites().add(filmOpt.get());
userService.save(user);
}
return filmOpt.map(filmMapper::toDto);
}
用户服务:
/**
* Save a user.
*
* @param user the entity to save.
* @return the persisted entity.
*/
public User save(User user) {
log.debug("Request to save User : {}", user);
return userRepository.save(user);
}
如果有人能帮助我,那就太好了!提前致谢:)
您正在从数据库中读取用户,因此调用保存将调用 EntityManger.merge
。因此你还需要添加
CascadeType.MERGE
到 ManyToMany
映射。
我有一个 Spring 引导项目(使用 JHipster),其中包含 2 个 JPA 实体:用户和电影。
我在它们之间创建了一个单向的多对多关系。 用户是关系的所有者。
我想将电影添加到用户(用户实体中的属性 'favorites')最喜欢的电影列表中。
但是当我尝试将电影添加到收藏夹列表时,table 'user_film_favorite' 中没有任何内容(在两个实体之间加入 table)。
映射似乎没问题,因为当我在此连接中手动输入数据时 table,我能够检索用户的电影列表。
我在这里找了很多类似的问题,但找不到问题所在。
实体用户:
@Entity
@Table(name = "jhi_user")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class User extends AbstractAuditingEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// Other properties
@ManyToMany(cascade = CascadeType.PERSIST)
@JoinTable(
name = "user_film_favorite",
joinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "id") },
inverseJoinColumns = { @JoinColumn(name = "movie_id", referencedColumnName = "id") }
)
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@BatchSize(size = 20)
private List<Film> favorites = new ArrayList<>();
实体片:
@Entity
@Table(name = "film")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Film implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@NotNull
@Column(name = "title", nullable = false)
private String title;
@Column(name = "plot")
private String plot;
@Column(name = "rating")
private Float rating;
电影服务:
/**
* Add one film to current user favorites.
*
* @param id the id of the film.
* @return the film saved into user favorites.
*/
@Transactional(readOnly = true)
public Optional<FilmDTO> addToFavorites(Long id) {
log.debug("Request to get Film : {}", id);
Optional<Film> filmOpt = filmRepository.findById(id);
// Get current logged user with his favorites
Optional<User> userOpt = userService.getUserWithFavorites();
if (filmOpt.isPresent() && userOpt.isPresent()) {
User user = userOpt.get();
user.getFavorites().add(filmOpt.get());
userService.save(user);
}
return filmOpt.map(filmMapper::toDto);
}
用户服务:
/**
* Save a user.
*
* @param user the entity to save.
* @return the persisted entity.
*/
public User save(User user) {
log.debug("Request to save User : {}", user);
return userRepository.save(user);
}
如果有人能帮助我,那就太好了!提前致谢:)
您正在从数据库中读取用户,因此调用保存将调用 EntityManger.merge
。因此你还需要添加
CascadeType.MERGE
到 ManyToMany
映射。