Java 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

事实上,我对hibernate还不熟悉,正在研究一对多双向映射。关系是这样的

  • 一个用户拥有多个博客
  • 一个用户拥有多个论坛
  • 根据我的理解,如果我们在博客模型中使用@ManyToOne注释和@JoinColumn,那么就没有必要在博客中明确添加外键(用户id)列。但问题是,当我试图持久化数据时,用户id列采用空值。如果我在blog模型中显式地编写userid属性及其getter和setter,那么一切都可以正常工作

    Users.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;
        }
        }
    
    }
    
    }

    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