本章我们来学习一下ActiveRecord中的关联,即一对一、一对多、多对一等关联问题!
1、先新建一个authors表和books表
create table authors(
id int primary key auto_increment,
name varchar(10) default null
)
create table books(
id int primary key auto_increment,
name varchar(10) default null,
authorId int
)
2、我们认为authors表和books表是一对多的关系,即一个author拥有多个book,建立对应的域模型对象
Author.java
package models;
import java.util.List;
import com.et.ar.*;
import com.et.ar.annotations.*;
@Table(name = "authors")
public class Author extends ActiveRecordBase {
@Id
private Integer id;
@Column
private String name;
@HasMany(foreignKey = "authorId", dependent = DependentType.DELETE, order = "id")
private List<Book> books;
// get,set...
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Book> getBooks() {
return books;
}
public void setBooks(List<Book> books) {
this.books = books;
}
}
Book.java
package models;
import com.et.ar.*;
import com.et.ar.annotations.*;
@Table(name = "books")
public class Book extends ActiveRecordBase {
@Id
private Integer id;
@Column
private Integer authorId;
@Column
private String name;
@BelongsTo(foreignKey = "authorId")
private Author author;
// get,set...
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getAuthorId() {
return authorId;
}
public void setAuthorId(Integer authorId) {
this.authorId = authorId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Author getAuthor() {
return author;
}
public void setAuthor(Author author) {
this.author = author;
}
}
3、这里解释一下这三种关联关系:
(1)、一对多:一对多关联是指一个类(比如Author)拥有另一个类(比如Book)的多个实例,用@HashMany注解描述,如上面的Author类;
@HasMany有几个属性:
foreignKey指定多方的外键,必须指定。
dependent指定在删除主表时做何操作,可选。有DELETE,DESTROY,NULLIFY,DELETE是简单的删除从表记录;DESTROY是再以级联的方式销毁从表对应的对象,如果这种级联关系有二级以上,则使用DESTROY会比较合适;NULLIFY是将从表的外键置为NULL值而并不删除。
order指定获取从表对应的记录时的排序字段,可选。
(2)、多对一:是指一个类属于另一个类,比如上面的Book类,使用@BelongsTo注解描述多对一关系。
(3)、一对一:一对一是一对多的特例,使用@HasOne描述,如:
@Table(name="authors")
public class Author extends ActiveRecordBase{
@Id private Integer id;
@Column private String name;
@HasOne(foreignKey="authorId")
private Book book;
//get,set...
}
@HasOne注解的其他用法同@HasMany
4、定义了模型对象之间的关联之后,新建一个AuthorController,用于操作模型对象:
package controllers;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import models.Author;
import models.Book;
import models.User;
import com.et.mvc.JsonView;
import com.et.mvc.View;
import com.et.mvc.JspView;
public class AuthorController extends ApplicationController {
/**
* 查询全部作者及书籍
*/
public JsonView index() throws Exception {
List<Author> authors = Author.findAll(Author.class);
//List<User> users = User.findAll(User.class);
Map<String, Object> result = new HashMap<String, Object>();
result.put("success", true);
for (Author author : authors) {
//result.put(author.getId().toString(), author.getName());
result.put(author.getId().toString(), author.getBooks());
// System.out.println(user.getName());
}
JsonView view = new JsonView(result);
view.setContentType("text/html;charset=utf-8");// 允许指定ContentType
return view;
}
public void create() throws Exception {
Author author = new Author();
author.setName("author1");
List<Book> books = new ArrayList<Book>();
for(int i=0; i<3; i++){
Book book = new Book();
book.setName("book" + i);
books.add(book);
}
author.setBooks(books);
author.save();
redirect("index");
//return "hello,test2";
}
public void delete() throws Exception {
Author author = Author.find(Author.class, 5);
author.destroy();
redirect("index"); // 重定向到列表页面
}
}
5、调试运行,访问:http://localhost:8080/myDemo/author/index,列出当前Author及其Book
6、访问:http://localhost:8080/myDemo/author/create,新建一个Author及其Book
7、访问:http://localhost:8080/myDemo/author/delete,级联删除编号为5的Author及其Book
这章就到这,下章开始进入JQuery easyUI,这也是为什么我们这几章一直不好好弄界面的原因。