我有两个实体“人物”和“电影”。
@Entity
public class Person {
..some fields
@ManyToMany(fetch = FetchType.LAZY, mappedBy = "actors")
@OrderBy("id")
private Set<Movie> moviesActor = new TreeSet<>();
}
@Entity
public class Movie {
..fields
@JoinTable(name = "actor_movie",
joinColumns = { @JoinColumn(name = "movie_id") },
inverseJoinColumns = { @JoinColumn(name = "actor_id") })
private Set<Person> actors = new TreeSet<>();
}
由于存在多对多关系,因此有新表 actor_movie 来保存它。我怎样才能让每个人都拥有自己的电影集呢?所以我想要实现的是获取 actor_movie 表中存在的每个人。我尝试使用 Spring data jpa 但找不到正确的查询。
实体关系的最佳实践:
- 总是使用
fetch = FetchType.LAZY
.
- 当您想获取关系的另一面时,请使用
JOIN FETCH
Query.
这解决了LazyInitializationException
冬眠也。
- 总是使用
spring.jpa.open-in-view=false
Example:
由 Spring Data JPA 和 Hibernate 作为 JPA 提供者。
实体:
public class Blog{
...
@ManyToMany(fetch = FetchType.LAZY) //default is LAZY in ManyToMany
@JoinTable(name="blog_tag",
joinColumns = @JoinColumn(name = "blog_id"),
inverseJoinColumns = @JoinColumn(name = "tag_id"))
@OrderBy //order by tag id
private Set<Tag> tags = new HashSet<>();
//2 utility methods in owner side
public void addTag(Tag tag){
tags.add(tag);
tag.getBlogs().add(this);
}
public void removeTag(Tag tag){
tags.remove(tag);
tag.getBlogs().remove(this);
}
//override equals & hashcode
}
public class Tag {
...
@ManyToMany(mappedBy = "tags")
private Set<Blog> blogs = new HashSet<>();
//override equals & hashcode
}
现在假设您想要获取包含标签项的博客:
存储库:
@Repository
public interface BlogRepository extends JpaRepository<Blog, Long> {
@Query("select b from Blog b join fetch b.tags where b.name = :name")
Blog getBlog(@Param("name") String blogName);
}
service:
public interface BlogService {
Blog getBlog(String blogName);
}
@Service
public class BlogServiceImpl implements BlogService{
@Autowired
private BlogRepository blogRepository;
@Override
public Blog getBlog(String blogName) {
return blogRepository.getBlog(blogName);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)