Java Hibernate:一对多双向映射存储
事实上,我对hibernate还不熟悉,正在研究一对多双向映射。关系是这样的Java Hibernate:一对多双向映射存储,java,hibernate,spring-orm,Java,Hibernate,Spring Orm,事实上,我对hibernate还不熟悉,正在研究一对多双向映射。关系是这样的 一个用户拥有多个博客 一个用户拥有多个论坛 根据我的理解,如果我们在博客模型中使用@ManyToOne注释和@JoinColumn,那么就没有必要在博客中明确添加外键(用户id)列。但问题是,当我试图持久化数据时,用户id列采用空值。如果我在blog模型中显式地编写userid属性及其getter和setter,那么一切都可以正常工作 Users.java @Entity @Table public class Us
@Entity
@Table
public class Users {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator= "generator")
@SequenceGenerator(name = "generator" , sequenceName="users_seq" , allocationSize=1)
private int user_id;
private String name,password,email,role,status,isOnline;
@OneToMany(mappedBy="user",cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@JsonManagedReference
private List<Blog> blog = new ArrayList<Blog>();
@OneToMany(mappedBy="user",cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@JsonManagedReference
private List<Forum> forum = new ArrayList<Forum>();
@OneToMany(mappedBy="user",cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@JsonManagedReference
private List<Friend> friend = new ArrayList<Friend>();
public List<Forum> getForum() {
return forum;
}
public List<Friend> getFriend() {
return friend;
}
public void setFriend(List<Friend> friend) {
this.friend = friend;
}
public void setForum(List<Forum> forum) {
this.forum = forum;
}
public List<Blog> getBlog() {
return blog;
}
public void setBlog(List<Blog> blog) {
this.blog = blog;
}
public int getUser_id() {
return user_id;
}
public void setUser_id(int user_id) {
this.user_id = user_id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getIsOnline() {
return isOnline;
}
public void setIsOnline(String isOnline) {
this.isOnline = isOnline;
}
@Entity
@Table
public class Blog {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator= "generator")
@SequenceGenerator(name = "generator" , sequenceName="blog_seq" , allocationSize=1)
private int blog_id;
private int likes,user_id; // I need to explicitly write the user_id column here
public int getUser_id() {
return user_id;
}
public void setUser_id(int user_id) {
this.user_id = user_id;
}
private String blog_name,blog_content,status;
@Temporal(TemporalType.DATE)
private Date create_date;
@ManyToOne
@JoinColumn(name="user_id",insertable=false, updatable=false) // This step will actually add the user_id column in the Blog model but it's not happening
@JsonBackReference
private Users user;
public Users getUser() {
return user;
}
public void setUser(Users user) {
this.user = user;
}
public int getBlog_id() {
return blog_id;
}
public void setBlog_id(int blog_id) {
this.blog_id = blog_id;
}
public int getLikes() {
return likes;
}
public void setLikes(int likes) {
this.likes = likes;
}
public String getBlog_name() {
return blog_name;
}
public void setBlog_name(String blog_name) {
this.blog_name = blog_name;
}
public String getBlog_content() {
return blog_content;
}
public void setBlog_content(String blog_content) {
this.blog_content = blog_content;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public Date getCreate_date() {
return create_date;
}
public void setCreate_date(Date create_date) {
this.create_date = create_date;
}
@EnableTransactionManagement
@Repository("blogDAO")
public class BlogDAOImpl implements BlogDAO {
@Autowired
SessionFactory sessionFactory;
public BlogDAOImpl(SessionFactory sessionFactory) {
super();
this.sessionFactory = sessionFactory;
}
public BlogDAOImpl() {
super();
// TODO Auto-generated constructor stub
}
@Transactional
public boolean addOrUpdateBlog(Blog blog) {
try{
sessionFactory.getCurrentSession().saveOrUpdate(blog);
return true;
}
catch(Exception e)
{
System.out.println("Exception in addOrUpdateBlog of BlogDAOImpl");
e.printStackTrace();
return false;
}
}
@Transactional
public boolean deleteBlog(Blog blog) {
try
{
sessionFactory.getCurrentSession().delete(blog);
return true;
}
catch(Exception e)
{
System.out.println("Exception in deleteBlog of BlogDAOImpl");
e.printStackTrace();
return false;
}
}
@Transactional
public List<Blog> getListOfBlog() {
try
{
String hql = "from Blog";
Session session = sessionFactory.openSession();
Query query = session.createQuery(hql);
List<Blog> bloglist = query.list();
session.close();
return bloglist;
}
catch(Exception e)
{
System.out.println("Exception in getListOfBlog of BlogDAOImpl");
e.printStackTrace();
return null;
}
}
@Transactional
public Blog getParticularBlog(int blogid) {
try
{
return (Blog) sessionFactory.getCurrentSession().get(Blog.class, blogid);
}
catch(Exception e)
{
System.out.println("Exception in getParticularBlog of BlogDAOImpl");
e.printStackTrace();
return null;
}
}
}
}
BlogDAOImpl.java
@Entity
@Table
public class Users {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator= "generator")
@SequenceGenerator(name = "generator" , sequenceName="users_seq" , allocationSize=1)
private int user_id;
private String name,password,email,role,status,isOnline;
@OneToMany(mappedBy="user",cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@JsonManagedReference
private List<Blog> blog = new ArrayList<Blog>();
@OneToMany(mappedBy="user",cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@JsonManagedReference
private List<Forum> forum = new ArrayList<Forum>();
@OneToMany(mappedBy="user",cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@JsonManagedReference
private List<Friend> friend = new ArrayList<Friend>();
public List<Forum> getForum() {
return forum;
}
public List<Friend> getFriend() {
return friend;
}
public void setFriend(List<Friend> friend) {
this.friend = friend;
}
public void setForum(List<Forum> forum) {
this.forum = forum;
}
public List<Blog> getBlog() {
return blog;
}
public void setBlog(List<Blog> blog) {
this.blog = blog;
}
public int getUser_id() {
return user_id;
}
public void setUser_id(int user_id) {
this.user_id = user_id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getIsOnline() {
return isOnline;
}
public void setIsOnline(String isOnline) {
this.isOnline = isOnline;
}
@Entity
@Table
public class Blog {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator= "generator")
@SequenceGenerator(name = "generator" , sequenceName="blog_seq" , allocationSize=1)
private int blog_id;
private int likes,user_id; // I need to explicitly write the user_id column here
public int getUser_id() {
return user_id;
}
public void setUser_id(int user_id) {
this.user_id = user_id;
}
private String blog_name,blog_content,status;
@Temporal(TemporalType.DATE)
private Date create_date;
@ManyToOne
@JoinColumn(name="user_id",insertable=false, updatable=false) // This step will actually add the user_id column in the Blog model but it's not happening
@JsonBackReference
private Users user;
public Users getUser() {
return user;
}
public void setUser(Users user) {
this.user = user;
}
public int getBlog_id() {
return blog_id;
}
public void setBlog_id(int blog_id) {
this.blog_id = blog_id;
}
public int getLikes() {
return likes;
}
public void setLikes(int likes) {
this.likes = likes;
}
public String getBlog_name() {
return blog_name;
}
public void setBlog_name(String blog_name) {
this.blog_name = blog_name;
}
public String getBlog_content() {
return blog_content;
}
public void setBlog_content(String blog_content) {
this.blog_content = blog_content;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public Date getCreate_date() {
return create_date;
}
public void setCreate_date(Date create_date) {
this.create_date = create_date;
}
@EnableTransactionManagement
@Repository("blogDAO")
public class BlogDAOImpl implements BlogDAO {
@Autowired
SessionFactory sessionFactory;
public BlogDAOImpl(SessionFactory sessionFactory) {
super();
this.sessionFactory = sessionFactory;
}
public BlogDAOImpl() {
super();
// TODO Auto-generated constructor stub
}
@Transactional
public boolean addOrUpdateBlog(Blog blog) {
try{
sessionFactory.getCurrentSession().saveOrUpdate(blog);
return true;
}
catch(Exception e)
{
System.out.println("Exception in addOrUpdateBlog of BlogDAOImpl");
e.printStackTrace();
return false;
}
}
@Transactional
public boolean deleteBlog(Blog blog) {
try
{
sessionFactory.getCurrentSession().delete(blog);
return true;
}
catch(Exception e)
{
System.out.println("Exception in deleteBlog of BlogDAOImpl");
e.printStackTrace();
return false;
}
}
@Transactional
public List<Blog> getListOfBlog() {
try
{
String hql = "from Blog";
Session session = sessionFactory.openSession();
Query query = session.createQuery(hql);
List<Blog> bloglist = query.list();
session.close();
return bloglist;
}
catch(Exception e)
{
System.out.println("Exception in getListOfBlog of BlogDAOImpl");
e.printStackTrace();
return null;
}
}
@Transactional
public Blog getParticularBlog(int blogid) {
try
{
return (Blog) sessionFactory.getCurrentSession().get(Blog.class, blogid);
}
catch(Exception e)
{
System.out.println("Exception in getParticularBlog of BlogDAOImpl");
e.printStackTrace();
return null;
}
}
}
@EnableTransactionManagement
@存储库(“blogDAO”)
公共类BlogDAOImpl实现BlogDAO{
@自动连线
会话工厂会话工厂;
公共BlogDAOImpl(SessionFactory SessionFactory){
超级();
this.sessionFactory=sessionFactory;
}
公共BlogDAOImpl(){
超级();
//TODO自动生成的构造函数存根
}
@交易的
公共布尔addOrUpdateBlog(博客){
试一试{
sessionFactory.getCurrentSession().saveOrUpdate(博客);
返回true;
}
捕获(例外e)
{
System.out.println(“BlogDAOImpl的addOrUpdateBlog中的异常”);
e、 printStackTrace();
返回false;
}
}
@交易的
公共博客(Blog Blog){
尝试
{
sessionFactory.getCurrentSession().delete(博客);
返回true;
}
捕获(例外e)
{
System.out.println(“BlogDAOImpl的deleteBlog中的异常”);
e、 printStackTrace();
返回false;
}
}
@交易的
公共列表getListOfBlog(){
尝试
{
字符串hql=“from Blog”;
Session Session=sessionFactory.openSession();
Query=session.createQuery(hql);
List bloglist=query.List();
session.close();
返回博客列表;
}
捕获(例外e)
{
System.out.println(“BlogDAOImpl的getListOfBlog中的异常”);
e、 printStackTrace();
返回null;
}
}
@交易的
公共博客GetSpecificularBlog(intBlogId){
尝试
{
return(Blog)sessionFactory.getCurrentSession().get(Blog.class,blogid);
}
捕获(例外e)
{
System.out.println(“BlogDAOImpl的getSpecificularBlog中的异常”);
e、 printStackTrace();
返回null;
}
}
}
博客REST控制器
package com.coding.blogandforum.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.coding.blogandforum.DAO.BlogDAO;
import com.coding.blogandforum.DAO.UserDAO;
import com.coding.blogandforum.model.Blog;
import com.coding.blogandforum.model.Users;
@RestController
public class BlogController {
@Autowired
BlogDAO blogDAO;
@Autowired
Blog blog;
@Autowired
Users user;
@Autowired
UserDAO userDAO;
// To get the list of all the blog objects
@RequestMapping(value="/getListOfBlog", method=RequestMethod.GET)
public ResponseEntity<List<Blog>> getListOfBlog()
{
List<Blog> bloglist = blogDAO.getListOfBlog();
return new ResponseEntity<List<Blog>>(bloglist,HttpStatus.OK);
}
/*
* To get a particular Blog details using blog id
* In postman, blog details are only displayed.
*/
@RequestMapping(value="/getParticularBlog/{blogid}", method=RequestMethod.GET)
public ResponseEntity<Blog> getParticularBlog(@PathVariable("blogid") int blogid)
{
Blog particularblog = blogDAO.getParticularBlog(blogid);
return new ResponseEntity<Blog>(particularblog,HttpStatus.OK);
}
/*
* To get a particular user details with blogid
* In postman the user will display the blog and forum details along with it
*/
@RequestMapping(value="/getUserDetailsWithBlogid/{blogid}", method=RequestMethod.GET)
public ResponseEntity<Users> getUserDetailsWithBlogid(@PathVariable("blogid") int blogid)
{
Blog blogwithuser = blogDAO.getParticularBlog(blogid);
return new ResponseEntity<Users>(blogwithuser.getUser(),HttpStatus.OK);
}
// To add a particular blog details in the DB
@RequestMapping(value="/addBlog", method=RequestMethod.POST)
public ResponseEntity<String> addBlog(@RequestBody Blog blog)
{
System.out.println(blog.getUser());
blog.setStatus("PENDING");
blogDAO.addOrUpdateBlog(blog);
return new ResponseEntity<String>("Blog added successfully",HttpStatus.OK);
}
// To delete a particular blog from the DB
@RequestMapping(value="/deleteBlog/{blogid}", method=RequestMethod.DELETE)
public ResponseEntity<String> deleteBlog(@PathVariable("blogid") int blogid)
{
blogDAO.deleteBlog(blogDAO.getParticularBlog(blogid));
return new ResponseEntity<String>("Blog deleted successfully",HttpStatus.OK);
}
/*
* To update a particular blog
* Date will not be displayed as YYYY-MM-DD in postman since the updateblog date property is not temporal
*/
@RequestMapping(value="/updateBlog/{blogid}", method=RequestMethod.PUT)
public ResponseEntity<Blog> updateBlog(@PathVariable("blogid") int blogid, @RequestBody Blog blog)
{
Blog updateblog = blogDAO.getParticularBlog(blogid);
//updateblog.setBlog_content(blog.getBlog_content());
updateblog.setCreate_date(blog.getCreate_date());
blogDAO.addOrUpdateBlog(updateblog);
return new ResponseEntity<Blog>(updateblog,HttpStatus.OK);
}
}
package com.coding.blogandforum.controller;
导入java.util.List;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.http.HttpStatus;
导入org.springframework.http.ResponseEntity;
导入org.springframework.web.bind.annotation.PathVariable;
导入org.springframework.web.bind.annotation.RequestBody;
导入org.springframework.web.bind.annotation.RequestMapping;
导入org.springframework.web.bind.annotation.RequestMethod;
导入org.springframework.web.bind.annotation.RestController;
导入com.coding.blogandforum.DAO.BlogDAO;
导入com.coding.blogandforum.DAO.UserDAO;
导入com.coding.blogandforum.model.Blog;
导入com.coding.blogandforum.model.Users;
@RestController
公共类BlogController{
@自动连线
BlogDAO BlogDAO;
@自动连线
博客;
@自动连线
用户;
@自动连线
UserDAO UserDAO;
//获取所有博客对象的列表
@RequestMapping(value=“/getListOfBlog”,method=RequestMethod.GET)
公共响应getListOfBlog()
{
List bloglist=blogDAO.getListOfBlog();
返回新的ResponseEntity(bloglist,HttpStatus.OK);
}
/*
*使用博客id获取特定博客详细信息
*在postman中,只显示博客详细信息。
*/
@RequestMapping(value=“/GetSpecificularBlog/{blogid}”,method=RequestMethod.GET)
公共响应属性GetSpecificularBlog(@PathVariable(“blogid”)intBlogId)
{
Blog specificularblog=blogDAO.getspecificularblog(blogid);
返回新的ResponseEntity(特别是rblog、HttpStatus.OK);
}
/*
*使用blogid获取特定用户的详细信息
*在postman中,用户将显示博客和论坛的详细信息
*/
@RequestMapping(value=“/getUserDetailsWithBlogid/{blogid}”,method=RequestMethod.GET)
公共响应属性getUserDetailsWithBlogid(@PathVariable(“blogid”)intBlogId)
{
blogBlogWithUser=blogDAO.getSpecificularBlog(blogid);
返回新的ResponseEntity(blogwithuser.getUser(),HttpStatus.OK);
}
//在数据库中添加特定博客详细信息
@RequestMapping(value=“/addBlog”,method=RequestMethod.POST)
公共响应性addBlog(@RequestBody Blog)
{
System.out.println(blog.getUser());
blog.setStatus(“待定”);
addOrUpdateBlog(blog);
返回新的响应状态(“博客添加成功”,HttpStatus.OK);
}
//从数据库中删除特定博客的步骤
@RequestMapping(value=“/deleteBlog/{blogid}”,method=RequestMethod.DELETE)
公共响应属性deleteBlog(@PathVariable(“blogid”)int blogid)
{
deleteBlog(blogDAO.getSpecificularBlog(blogid));
返回新的响应状态(“博客删除成功”,HttpStatus.OK);
}
/*
*更新特定博客的步骤
*由于updateblog Date属性不是临时属性,因此日期在postman中不会显示为YYYY-MM-DD
*/
@RequestMapping(value=“/updateBlog/{blogid}”,method=RequestMethod.PUT)
公共响应性更新日志(@PathVariable(“blogid”)int blogid,@RequestBody Blog)
{
Blog updateblog=blogDAO.getspecificularblog(blogid);
//updateblog.setBlog_content(blog.getBlog_content());
updateblog.setCreate_date(blog.getCreate_date());
blogDAO.addorupdate