• Spring JPA中OneToOne和OneToMany用法


    Spring工程中,创建实体对象时,可以通过JPA的@Entity标识实体与数据库表的对应关系,@Column标识数据库字段。其中还有标识两个实体间关系的注解:@OneToOne、@OneToMany、@ManyToOne和@ManyToMany,分别标识一对一、一对多、多对一和多对多。在此,简单记录下@OneToOne和@OneToMany的使用。其中还会涉及注解@JoinColumn,其修饰的字段为关系维护字段。

    @OneToOne

      @OneToOne与@JoinColumn结合使用,表示会在源实体(Source Entity,即声明该注解的实体类中创建外键,进行级联),以Book和BookDetail为例。

      Book类,会在book表中创建book_detail外键:

    @Entity
    @Table(name = "book")
    @DynamicInsert(true)
    public class Book implements Serializable{
    
        private static final long serialVersionUID = 1L;
    
        @Id
        @Column(name = "id")
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private long id;
        
        @Column(name = "name")
        private String name;
    
        @OneToOne(cascade = CascadeType.ALL)
        @JoinColumn(name = "bookDetail")
        private BookDetail bookDetail;
        
        public BookDetail getBookDetail() {
            return bookDetail;
        }
    
        public void setBookDetail(BookDetail bookDetail) {
            this.bookDetail = bookDetail;
        }
    
        public long getId() {
            return id;
        }
    
        public void setId(long id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
        
    }

       BookDetail类,mappedBy 表示由Book类的bookDetail维护外键:

    @Entity
    @Table(name = "bookdetail")
    @DynamicInsert(true)
    public class BookDetail implements Serializable{
    
        private static final long serialVersionUID = 1L;
    
        /**
         * 主键
         */
        @Id
        @Column(name = "id")
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private long id;
        
        @Column(name = "numOfPages")
        private int numOfPages;
        
        @OneToOne(cascade = CascadeType.ALL, mappedBy = "bookDetail")
        private Book book;
    
        public Book getBook() {
            return book;
        }
    
        public void setBook(Book book) {
            this.book = book;
        }
    
        public long getId() {
            return id;
        }
    
        public void setId(long id) {
            this.id = id;
        }
    
        public int getNumOfPages() {
            return numOfPages;
        }
    
        public void setNumOfPages(int numOfPages) {
            this.numOfPages = numOfPages;
        }
    
    }

     book表:

    bookdetail表:

    保存Book对象的时候,会先将Bookdetail对象保存,然后设置Book对象外键,并保存。即先保存targetEntity,设置外键后,再保存sourceEntity

    @OneToMany

      @OneToMany与@JoinColumn结合使用,会在目标实体(targetEntity指定的类中创建外键)。报存的时候,先保存sourceEntity,设置外键后,再保存targetEntity。下方代码是一对多的情况:

    @OneToMany(targetEntity = SubVO.class, cascade=CascadeType.ALL)
        @JoinColumn(name="conditionid")
        private List<SubVO> subVO = new ArrayList<>();

    针对其他级联关系和级联类型的介绍,可参照JPA概念解析:CascadeType(各种级联操作)详解

    需要注意的是:

      (1)多对多情况,可以不用这种注解的方式,可以通过中间表维护级联关系(比如A和B表多对多,C表只包含2列A和B的主键映射,维护多对多关系),操作可能更方便。

      (2)这种级联谨慎使用,在查询等操作的时候,查A实体,也会把级联的B或C实体也查出来,但业务只需要A的信息,所以可能增加数据库负担。

    参考:https://www.jianshu.com/p/8ae19b367a1b

  • 相关阅读:
    程序猿也爱学英语(上),有图有真相
    New Year's resolution for 2016
    Got the Best Employee of the year 2015 Star Award
    AngularJs项目文件以及文件夹结构
    完成AngularJS with MVC 5, Web API 2项目
    两则新闻引发的思考
    关于招聘的最新信息
    架构师面试更新版
    2015新加坡总统府
    关于2014年的旅行
  • 原文地址:https://www.cnblogs.com/shuimuzhushui/p/9601095.html
Copyright © 2020-2023  润新知