/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package openbook.domain; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.ManyToMany; import javax.persistence.OneToOne; import javax.persistence.Version; /** * <A name="class"/> * An immutable persistent entity represents a Book. * <br> * The mutable properties of the book such as number of items in stock etc. * are factored out in a separate {@link Inventory} instance. * <br> * The state of inventory is mutable, but the relation to inventory is immutable. * * <LI><b>Identity</b>: Application-defined identity. * <LI><b>Mapping</b>: One-to-One bi-directional, immutable mapping to {@link Inventory}. * Many-to-Many bi-directional mapping to {@linkplain Author}. * <LI><b>Version</b>: No. * <p> * * @author Pinaki Poddar * */ @SuppressWarnings("serial") @Entity public class Book implements Serializable { @Id private String ISBN; private String title; private double price; @OneToOne(mappedBy="book", fetch=FetchType.LAZY, cascade=CascadeType.ALL, optional=false, orphanRemoval=true) private Inventory inventory; /** * <A name="authors"> * A many-to-many <em>eager</em> relation. * By default, many-to-many relations are lazily fetched. */ @ManyToMany(fetch=FetchType.EAGER) private List<Author> authors; /** * A no-arg constructor is required for JPA Specification. */ public Book() { } /** * Construct a book with given parameters. * * @param ISBN primary identity of this Book * @param title Title of the book. * @param price price of the book. * @param initialSupply initial inventory quantity. */ public Book(String ISBN, String title, double price, int initialSupply) { this.ISBN = ISBN; this.title = title; this.price = price; inventory = new Inventory(this, initialSupply); } public String getISBN() { return ISBN; } public String getTitle() { return title; } public double getPrice() { return price; } public List<Author> getAuthors() { return authors; } public void addAuthor(Author...authors) { if (this.authors == null) this.authors = new ArrayList<Author>(); for (Author a : authors) { if (!this.authors.contains(a)) this.authors.add(a); } } public void setAuthors(List<Author> authors) { this.authors = authors; } public Inventory getInventory() { return inventory; } @Version private int version; public int getVersion() { return version; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((ISBN == null) ? 0 : ISBN.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Book other = (Book) obj; if (ISBN == null) { if (other.ISBN != null) return false; } else if (!ISBN.equals(other.ISBN)) return false; return true; } }