/*
* JBoss, Home of Professional Open Source
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package com.jboss.dvd.seam;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import org.apache.solr.analysis.LowerCaseFilterFactory;
import org.apache.solr.analysis.NGramFilterFactory;
import org.apache.solr.analysis.StandardTokenizerFactory;
import org.hibernate.search.annotations.AnalyzerDef;
import org.hibernate.search.annotations.DocumentId;
import org.hibernate.search.annotations.Fields;
import org.hibernate.search.annotations.Parameter;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Analyzer;
import org.hibernate.search.annotations.Index;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.IndexedEmbedded;
import org.hibernate.search.annotations.TokenFilterDef;
import org.hibernate.search.annotations.TokenizerDef;
@Entity
@Table(name="PRODUCTS")
@Indexed
@AnalyzerDef(name="ngrams", tokenizer=@TokenizerDef(factory=StandardTokenizerFactory.class),
filters={
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(factory = NGramFilterFactory.class,
params = { @Parameter(name = "minGramSize", value = "3"), @Parameter(name = "maxGramSize", value = "3") })
})
public class Product implements Serializable
{
private static final long serialVersionUID = -5378546367347755065L;
long productId;
String asin;
String title;
String description;
String imageURL;
BigDecimal price = BigDecimal.ZERO;
List<Actor> actors;
Set<Category> categories;
Inventory inventory;
@Id @GeneratedValue
@Column(name="PROD_ID")
@DocumentId
public long getProductId() {
return productId;
}
public void setProductId(long id) {
this.productId = id;
}
@Column(name="ASIN", length=16)
@Field(index=Index.UN_TOKENIZED)
public String getASIN() {
return asin;
}
public void setASIN(String asin) {
this.asin = asin;
}
@OneToOne(fetch=FetchType.LAZY,mappedBy="product")
public Inventory getInventory() {
return inventory;
}
public void setInventory(Inventory inventory) {
this.inventory = inventory;
}
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name="PRODUCT_ACTORS",
joinColumns=@JoinColumn(name="PROD_ID"),
inverseJoinColumns=@JoinColumn(name="ACTOR_ID"))
@IndexedEmbedded
public List<Actor> getActors() {
return actors;
}
public void setActors(List<Actor> actors) {
this.actors = actors;
}
@ManyToMany
@JoinTable(name="PRODUCT_CATEGORY",
joinColumns=@JoinColumn(name="PROD_ID"),
inverseJoinColumns=@JoinColumn(name="CATEGORY"))
@IndexedEmbedded
public Set<Category> getCategories() {
return categories;
}
public void setCategories(Set<Category> categories) {
this.categories = categories;
}
@Column(name="TITLE",nullable=false,length=100)
@Fields({
@Field(index=Index.TOKENIZED),
@Field(index=Index.TOKENIZED, name="title:ngrams", analyzer=@Analyzer(definition="ngrams"))})
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
@Column(name="DESCRIPTION",length=1024)
@Fields({
@Field(index=Index.TOKENIZED),
@Field(index=Index.TOKENIZED, name="description:ngrams", analyzer=@Analyzer(definition="ngrams"))})
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Column(name="IMAGE_URL",length=256)
public String getImageURL() {
return imageURL;
}
public void setImageURL(String imageURL) {
this.imageURL = imageURL;
}
@Column(name="PRICE",nullable=false,precision=12,scale=2)
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price=price;
}
}