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。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)