[JPA] hibernate,一对多级联添加时,执行多条sql语句

[JPA] hibernate,一对多级联添加时,执行多条sql语句,第1张

首先你需要明确一点

HIBERNATE对于大批量DML *** 作是不适用的。

你可以用HIBERNATE手写该条SQL语句

getHibernateTemplate().execute(new HibernateCallback(){

public Object doInHibernate(Session session)

throws HibernateException, SQLException {

String hql="手写的SQL,注意from后跟实体类名,要用属性的时候要用别名. *** 作"

Query query=session.createQuery(hql)

query.executeUpdate()

return null

}

})

进行面向对象的分析,uer和role之间是双向多对多联系,使用JPA配置如下所示:

@Entity

public class User implements Serizlizable {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

private int id

private String userName

private String passWord

@ManyToMany(cascade = CascadeType.ALL)

private List<Role>roles

......

......

}

@Entity

public class Role implements Serizlizable {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

private int id

private String role

@ManyToMany(mappedBy = "roles")

private User user

......

......

}

配置后,会在数据库中生存你想要的3个表。

有两种方式实现一对多的单向关联。一种是在只使用@OneToMany来标识,这种方式是通过一张第三方表来保存关系。还有一种是使用@OneToMany和@JoinColumn来标注,这种方式是在多的一方(Book)的表中增加一个外键列来保存关系。

第一种方式,通过一张第三方表来实现一对多的单向关联:

Author.java如下,需要注意private Set<Book>books = new HashSet<Book>()的注解。只是使用了@OneToMany。

1 package com.cndatacom.jpa.entity2  3 import java.util.HashSet4 import java.util.Set5  6 import javax.persistence.CascadeType7 import javax.persistence.Column8 import javax.persistence.Entity9 import javax.persistence.FetchType10 import javax.persistence.GeneratedValue11 import javax.persistence.Id12 import javax.persistence.OneToMany13 import javax.persistence.Table14 15 16 /**17  *  作者18  * @author Luxh19  */20 21 @Entity22 @Table(name="author")23 public class Author {24     25     @Id26     @GeneratedValue27     private Long id28     29     /**作者的名字*/30     @Column(length=32)31     private String name32     33     /**作者写的书*/34     @OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)//级联保存、更新、删除、刷新延迟加载35     private Set<Book>books = new HashSet<Book>()36     37     38     39     public Long getId() {40         return id41     }42 43 44     public void setId(Long id) {45         this.id = id46     }47 48 49     public String getName() {50         return name51     }52 53 54     public void setName(String name) {55         this.name = name56     }57 58 59     public Set<Book>getBooks() {60         return books61     }62 63 64     public void setBooks(Set<Book>books) {65         this.books = books66     }67 68 69     70     71 }

Book.java如下,因为是单向的关联,所以这个实体不需要加任何的关联标识。

1 package com.cndatacom.jpa.entity2  3 import javax.persistence.Column4 import javax.persistence.Entity5 import javax.persistence.GeneratedValue6 import javax.persistence.Id7 import javax.persistence.Table8  9 /**10  * 书11  * @author Luxh12  */13 14 @Entity15 @Table(name="book")16 public class Book {17     18     @Id19     @GeneratedValue20     private Long id21     22     /**书名*/23     @Column(length=32)24     private String name25     26     public Long getId() {27         return id28     }29 30     public void setId(Long id) {31         this.id = id32     }33 34     public String getName() {35         return name36     }37 38     public void setName(String name) {39         this.name = name40     }41 42     43 }

只在Author实体中对private Set<Book>books = new HashSet<Book>()加上标注@OneToMany实现单向关联。这样就通过一个关联表来实现这种关联。生成数据库表如下,会以Author的表名和下划线和Book的表名生成一张表author_book来保存Author和Book的一对多单向映射。

在author_book表中,存的是Auhtor的id和Book的id:

第二种方式,通过在多方(Book)的表中增加一个外键列实现一对多的单向关联。

Author.java如下,需要注意private Set<Book>books = new HashSet<Book>()的注解。同时使用了@OneToMany和@JoinColumn。

1 package com.cndatacom.jpa.entity2  3 import java.util.HashSet4 import java.util.Set5  6 import javax.persistence.CascadeType7 import javax.persistence.Column8 import javax.persistence.Entity9 import javax.persistence.FetchType10 import javax.persistence.GeneratedValue11 import javax.persistence.Id12 import javax.persistence.JoinColumn13 import javax.persistence.OneToMany14 import javax.persistence.Table15 16 17 /**18  *  作者19  * @author Luxh20  */21 22 @Entity23 @Table(name="author")24 public class Author {25     26     @Id27     @GeneratedValue28     private Long id29     30     /**作者的名字*/31     @Column(length=32)32     private String name33     34     /**作者写的书*/35     @OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)//级联保存、更新、删除、刷新延迟加载36     @JoinColumn(name="author_id")//在book表增加一个外键列来实现一对多的单向关联37     private Set<Book>books = new HashSet<Book>()38     39     40     41     public Long getId() {42         return id43     }44 45 46     public void setId(Long id) {47         this.id = id48     }49 50 51     public String getName() {52         return name53     }54 55 56     public void setName(String name) {57         this.name = name58     }59 60 61     public Set<Book>getBooks() {62         return books63     }64 65 66     public void setBooks(Set<Book>books) {67         this.books = books68     }69 70 71     72     73 }

Book.java不变。

在数据库中只生成了两张表:author和book。

再看book表的结构,会多了一列author_id。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11944782.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存