//双向一对多 两边都可以维护关系
@ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name = "pid")
@OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "pid")
//双向多的一方维护关系 只有多的一方可以维护关系
//双向一对多 案例
需求:一个用户,可以评论,评论可以有图片
package com.oracle.bean5; import lombok.Data; import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; import java.util.List; @Data @Entity @Table(name = "TUser") public class User { @Id @GeneratedValue(generator = "uuid") @GenericGenerator(name = "uuid",strategy = "uuid") private String usid; private String uname; private String upwd; @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "usid") private List<Comment> comments; }
package com.oracle.bean5; import lombok.Data; import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; import java.util.Date; import java.util.List; @Data @Entity @Table(name="TComment") public class Comment { @Id @GeneratedValue(generator = "uuid") @GenericGenerator(name = "uuid",strategy = "uuid") private String comid; @Temporal(value = TemporalType.TIMESTAMP) private Date commentTime; private String context; @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name = "usid") private User user; @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name = "pid") private Product product; @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "comid") @OrderBy private List<CommentImg> commentImgs; }
package com.oracle.bean5; import lombok.Data; import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; @Data @Entity @Table(name="TCommentImg") public class CommentImg { @Id @GeneratedValue(generator = "uuid") @GenericGenerator(name = "uuid",strategy = "uuid") private String imgid; private String imgurl; // @ManyToOne(cascade = CascadeType.ALL) @ManyToOne @JoinColumn(name = "comid") private Comment comment; }
package com.oracle.bean5; import lombok.Data; import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; import java.util.List; @Data @Entity @Table(name="TProduct") public class Product { @Id @GeneratedValue(generator = "uuid") @GenericGenerator(name = "uuid",strategy = "uuid") private String pid; private String panme; @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name="pid") @OrderBy private List<Comment> comments;//pid是Comment是的外键 }
package com.oracle.core; import com.oracle.bean5.Comment; import com.oracle.bean5.CommentImg; import com.oracle.bean5.Product; import com.oracle.bean5.User; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.junit.After; import org.junit.Before; import org.junit.Test; import javax.persistence.Entity; import java.util.ArrayList; import java.util.Date; import java.util.List; public class OneToMany22 { private SessionFactory sessionFactory; private Session session; @Before public void begin(){ org.hibernate.cfg.Configuration cfg=new org.hibernate.cfg.Configuration(); cfg.configure(); sessionFactory = cfg.buildSessionFactory(); session = sessionFactory.openSession(); session.beginTransaction(); } //需求:创建一个用户 创建一个商品 该用户为该商品添加一个评论 并且添加3个图片 @Test public void save(){ // User user = session.get(User.class, "8a8aac9463903a8c0163903a92560000"); //修改这个对象就变成持久对象 hibernate管理起来 自动做同步 //save操作 user对象 插入数据(数据表自动生成主键) 对象要和数据做同步 //save user->瞬态->持久化状态 //save操作 持久状态 当前对象和数据表要保持同步 //数据表已经有主键 保持同步 当前的对象也会有主键 User user=new User(); user.setUname("aaa"); user.setUpwd("123"); session.save(user); Product product=new Product(); product.setPanme("meizu"); List<Comment> commentList=new ArrayList<>(); Comment comment=new Comment(); comment.setUser(user);该user因为是持久化状态 所以会和数据表做同步 Date now =new Date(); comment.setCommentTime(now); comment.setContext("电视不错"); List<CommentImg> imglist=new ArrayList<>(); CommentImg img1=new CommentImg(); img1.setImgurl("www.baidu.com"); CommentImg img2=new CommentImg(); img2.setImgurl("www.baidu.com"); imglist.add(img1); imglist.add(img2); comment.setCommentImgs(imglist); commentList.add(comment); product.setComments(commentList); session.save(product); } //双向关联 在删除的时候必须将两边的关系全部都删除 //PS 单向关联 只需要删除一方就可以 /** * 需求 请将李四 这个人有关 小米电视的评论全部删除 同时将评论+评论相关的图片 * 双向关联 删除 要删除掉两边 */ @Test public void deleteds(){ Query query = session.createQuery("select u from User u where u.uname=?"); query.setParameter(0,"aaa"); User user=(User)query.uniqueResult(); List<Comment> comments = user.getComments(); int index=0; for(Comment comment:comments){ if(comment.getProduct().getPanme().equals("meizu")){ user.getComments().remove(index);//删除下标 //user.setComments(null); comment.setUser(null);//解除关系 comment.setProduct(null);//解除关系 session.delete(comment); } index++; } } //需求: 李四用户 评论了一个新商品 小爱智能人工智能音响 //但是 对这个商品 做2次评论 1.人工智能真不错 2.追评 小a真棒 并且上传一张图片 //删除 双向关联 不想删除的数据 关系都去掉 @Test public void xin(){ User user = session.get(User.class, "8a8aac94639163b301639163b7200000"); Product xiaoai=new Product(); xiaoai.setPanme("小爱智能人工智能音响"); List<Comment> commentlist=new ArrayList<>(); Comment comment1=new Comment(); comment1.setUser(user); comment1.setContext("人工智能真不错"); Comment comment2=new Comment(); comment2.setUser(user); comment2.setContext("小a真棒"); commentlist.add(comment1); commentlist.add(comment2); List<CommentImg> commentImgList=new ArrayList<>(); CommentImg img1=new CommentImg(); img1.setImgurl("第一张图片"); commentImgList.add(img1); comment2.setCommentImgs(commentImgList); xiaoai.setComments(commentlist); session.save(xiaoai); } //李四 小爱智能人工智能音响 ///第二条追评a字输入错了 需要去修改它把小a改成小爱 并且 上传3张新图片 将以前的图片删除掉 //梳理 save 修改 删除这里 @Test public void queryproduct(){ Query query = session.createQuery("from User u where u.uname=? "); query.setParameter(0,"aaa"); User user=(User)query.uniqueResult(); List<Comment> comments = user.getComments(); int index=0; for(Comment comment:comments){ if(comment.getProduct().getPanme().equals("小爱智能人工智能音响")){ index++; if(index==2){ List<CommentImg> commentImgs = comment.getCommentImgs(); for(CommentImg img:commentImgs){ img.setComment(null); session.delete(img); } String replaceText = comment.getContext().replace("a", "爱"); comment.setContext(replaceText); List<CommentImg> commentImgList=new ArrayList<>(); CommentImg commentImg1=new CommentImg(); commentImg1.setImgurl("第二张图片"); CommentImg commentImg2=new CommentImg(); commentImg2.setImgurl("第三张图片"); CommentImg commentImg3=new CommentImg(); commentImg3.setImgurl("第四张图片"); commentImgList.add(commentImg1); commentImgList.add(commentImg2); commentImgList.add(commentImg3); comment.setCommentImgs(commentImgList); session.update(comment); } } } } //商品 商品评论 评论的图片 @Test public void deletsp(){ Product product = session.get(Product.class, "8a8aac94639163b301639163b7320001"); List<Comment> comments = product.getComments(); for(Comment comment:comments){ comment.setUser(null); } session.delete(product); } @Test public void delete(){ Query query = session.createQuery("from User u where u.uname like ? "); query.setParameter(0,"aaa"); User user=(User)query.uniqueResult(); // lisi.getComments().get(0).getCommentImgs().remove(1); CommentImg commentImg = user.getComments().get(0).getCommentImgs().get(1); user.getComments().get(0).getCommentImgs().remove(1); // commentImg.setComment(null); commentImg.setComment(null);//解除关系 session.delete(commentImg); } @After public void end(){ //commit只对持久化状态对象做同步 //检查你当前的内存中的对象和数据表的数据是否是一致的 如果不一致 则自动做操作 session.getTransaction().commit(); //对象依然存在在内存中 对象属于游离状态 操作 数据的同步的操作 session.close(); sessionFactory.close(); } }
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="connection.url">jdbc:oracle:thin:@10.10.44.161:1521:ORCL</property> <property name="connection.driver_class">oracle.jdbc.OracleDriver</property> <property name="hbm2ddl.auto">update</property> <property name="show_sql">true</property> <property name="format_sql">true</property> <property name="connection.username">TANGBAO</property> <property name="connection.password">123456</property> <mapping class="com.oracle.bean7.Product"/> <mapping class="com.oracle.bean7.ShopCar"/> <mapping class="com.oracle.bean7.BaseBean"/> </session-factory> </hibernate-configuration>
需求:一个女生可以有多个男朋友
多对一的双向
mappedBy 我不维护关系
package com.oracle.bean6; import lombok.Data; import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; import java.util.List; @Data @Entity @Table(name="TWoman") public class Woman { @Id @GeneratedValue(generator = "uuid") @GenericGenerator(name = "uuid",strategy = "uuid") private String wid; private String wname; @OneToMany(mappedBy = "wid",cascade = CascadeType.ALL) private List<Man> mans; }
package com.oracle.bean6; import lombok.Data; import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; @Data @Entity @Table(name="TMan") public class Man { @Id @GeneratedValue(generator = "uuid") @GenericGenerator(name = "uuid",strategy = "uuid") private String mid; private String mname; @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name = "wid") private Woman wid; }