Коллекция книга-автор

Задача состоит в реализации связи книга-автор для интернет-магазина книг.

Введение в коллекции можно прочитать на сайте IBM. Также доступна короткая презентация  и статья на хабре.

В начале необходимо разбить на сущности и спроектировать классы.

Автор - отдельный класс Author, имеющий ФИО и уникальный для данного автора цифровой идентификатор.

Книга - отдельный класс Book, у каждой книги есть название, авторы и куча других параметров. Авторов будем держать в виде коллекции HashMap, где в качестве ключа будет целочисленный идентификатор автора, а значения сам объект автора.

При отображении витрины магазина потребуется выводить не одну книгу, а сразу несколько. Понадобится еще один класс Books, в который бизнес-логика будет загружать объекты книги (с включенными в каждуй книгу авторами) в зависимости от того, что надо отобразить на странице сайта. Книги в классе Books будем тоже хранить в HashMap, где ключ - идентификатор книги, а значение - объект книги Book.

Основной недостаток такого проектирования системы: в СУБД связи между книгой в авторами книги будет храниться в отдельной таблице, т.е. при загрузке объекта книги из БД придется постоянно join-ить данные из таблицы связей книга-автор.

Объект Author:

package jperm;

/** * * @author ars */ public class Author {

public Integer id; public String name; public String firstName; public String middleName; public String lastName; public Boolean status; public Integer getId { return this.id; }

public void setId(Integer id) { this.id = id; }

public String getName { return name; }

public void setName(String name) { this.name = name; }

public String getFirstName { return firstName; }

public void setFirstName(String firstName) { this.firstName = firstName; }

public String getMiddleName { return middleName; }

public void setMiddleName(String middleName) { this.middleName = middleName; }

public String getLastName { return lastName; }

public void setLastName(String lastName) { this.lastName = lastName; }

public Boolean getStatus { return status; }

public void setStatus(Boolean status) { this.status = status; }   @Override public String toString { String out = ""; out += "firstname: " + getFirstName + " middlename " + getMiddleName + " lastname " + getLastName + " id " + getId.toString; return out; } }

Класс Book:

package jperm;

import java.util.Date; import java.util.HashMap; import java.util.Map; /** * * @author ars */ public class Book { private Integer id; private String name; private Date publicDate; private String type; private Boolean status; private HashMap authors = new HashMap; // HashMap надо инициализировать.

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 Date getPublicDate { return publicDate; }

public void setPublicDate(Date publicDate) { this.publicDate = publicDate; }

public String getType { return type; }

public void setType(String type) { this.type = type; }

public Boolean getStatus { return status; }

public void setStatus(Boolean status) { this.status = status; }

public HashMap getAuthors { return authors; }

public void setAuthors(HashMap authors) { this.authors = authors; }

public void addAuthor(Author author) { Integer aid; System.out.println("addAuthor: " + author.id.toString); aid = author.getId; try { this.authors.put(aid, author); }      catch (Exception e) { System.out.println("Ошибка добавления автора." + e.getMessage + e.toString); }  }

public String getAuthorsString { String out = ""; if (authors == null) { return "Авторы null Ж(";      }       try {           out += "Авторы: '";           for ( Map.Entry entry : getAuthors.entrySet) {                out += "id:" + entry.getKey + " name: " + entry.getValue.getLastName + entry.getValue.getFirstName + entry.getValue.getMiddleName;           }           out += "'";       }        catch (Exception e) { out += "Ошибка: " + e.getMessage;}               return out;   } }

В классе Books вместо загрузки книг из БД напишем заглушки

package jperm;

import java.util.HashMap;

/** * * @author ars */ public class Books { private HashMap book = new HashMap; public HashMap getBook { return book; }

public void setBook(HashMap book) { this.book = book; }   // Загружает книги в Book // Лучше это делать из sql public void loadBooks { Author a1 = createAuthor(Integer.valueOf(1),"Ivan", "Ivanovich","Ivanov"); addBook(1,"Физика",a1); addBook(2,"Математика",createAuthor(Integer.valueOf(2),"Petr", "Petrovich","Petrov")); addBook(3,"Биология",createAuthor(Integer.valueOf(3),"Sidor", "Sidorovich","Sidorov")); }   private void addBook(Integer id, String name, Author author) { System.out.println("addBook. id=" + id + " name=" + name ); Book newbook = new Book; newbook.setId(id); newbook.setName(name); newbook.addAuthor(author); this.book.put(id, newbook); }   private Author createAuthor(Integer id, String firstName, String middleName, String lastName) { Author author = new Author; author.setId(id); author.setFirstName(firstName); author.setMiddleName(middleName); author.setLastName(lastName); return author; } }

Теперь осталось вывести на какой-то странице результат работы класса Books. Можно, например, создать проект Spring и вставить в нем в index.jsp что-то такое:

<%@page import="java.util.Map"%> <%@page import="java.util.Map.Entry"%> <%@page import="java.util.Set"%> <%@page import="java.util.HashMap"%> <%@page import="jperm.Book"%> <%@page import="jperm.Books"%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

 Welcome to Spring Web MVC project

<%           Books b = new Books; b.loadBooks; HashMap  booklist = b.getBook; for (Entry samebook : booklist.entrySet) { response.getWriter.println("Под номером " + samebook.getKey + " книга " + booklist.get(samebook.getKey).getName + " авторы " + booklist.get(samebook.getKey).getAuthorsString + " "); samebook.getValue; }           for ( Map.Entry entry : booklist.entrySet) { response.getWriter.println("Книга " + entry.getValue.getName + " Авторы " + entry.getValue.getAuthorsString); }               %>