package cn.newgxu.bbs.domain;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.Table;
import javax.persistence.Transient;
import cn.newgxu.bbs.common.Pagination;
import cn.newgxu.bbs.domain.user.User;
import cn.newgxu.jpamodel.JPAEntity;
import cn.newgxu.jpamodel.ObjectNotFoundException;
/**
*
* @author polly
* @since 4.0.0
* @version $Revision 1.1$
*/
@Entity
@Table(name = "area")
public class Area extends JPAEntity {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "id")
// @GeneratedValue(strategy = GenerationType.SEQUENCE,generator="id_seq")
// @SequenceGenerator(name="id_seq", sequenceName="seq_area")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id = -1;
@Column(name = "name", length = 255)
private String name;
@Column(name = "description", length = 2000)
private String description;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "area", fetch = FetchType.LAZY)
@OrderBy("compositorId")
private List<Forum> forums;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "webmaster_area", joinColumns = @JoinColumn(name = "area_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"))
private List<User> webmasters;
private int taxis;
private boolean hot;
private boolean hidden;
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Forum> getForums() {
return forums;
}
public void setForums(List<Forum> forums) {
this.forums = forums;
}
public boolean isHidden() {
return hidden;
}
public void setHidden(boolean hidden) {
this.hidden = hidden;
}
public boolean isHot() {
return hot;
}
public void setHot(boolean hot) {
this.hot = hot;
}
public int getTaxis() {
return taxis;
}
public void setTaxis(int taxis) {
this.taxis = taxis;
}
// ------------------------------------------------
public static Area get(int areaId) throws ObjectNotFoundException {
System.out.println(areaId);
return (Area) getById(Area.class, areaId);
}
public static Area getByName(String name) throws ObjectNotFoundException {
return (Area) SQ("from Area a where a.name = ?1 ", P(1, name),
new Pagination(1, 1));
}
@SuppressWarnings("unchecked")
public static List<Area> getAreas() {
return (List<Area>) Q(
"from Area a where a.hidden = 0 order by taxis asc",
new Pagination(1, Integer.MAX_VALUE)).getResultList();
}
@SuppressWarnings("unchecked")
public static List<Area> getAllAreas() {
return (List<Area>) Q("from Area a order by taxis asc",
new Pagination(1, Integer.MAX_VALUE)).getResultList();
}
@Transient
private List<Topic> latestTopics;
public List<Topic> getLatestTopics() {
return latestTopics;
}
public void setLatestTopics(List<Topic> latestTopics) {
this.latestTopics = latestTopics;
}
/**
* 获取同一个Area中的最新帖子,用于2012年论坛主页改版的“分区新帖”
* @param 想要获取帖子的数量
* @return 取得的帖子列表
* @author ivy
* @since 2012-04-01
*/
@SuppressWarnings("unchecked")
public List<Topic> getLatestTopics(int amount) {
if (amount == 0) {
return new ArrayList<Topic>(0);
}
if (amount < 1) {
amount = 10;
}
// from Topic t where t.forum.area.id = ?1 and t.forum.secrecy = f
return (List<Topic>) Q(
"from Topic t where t.forum.area.id = ?1 and t.forum.secrecy = false and t.invalid = 0 order by t.id desc",
P(1, this.getId())).setFirstResult(0).setMaxResults(amount).getResultList();
}
/**
* 只获取特定的forum的最新帖子,比较蛋疼,上面那个方法已经可以了,但是这个是去的特定的forum的
* @param id
* @param number
* @return
*/
@SuppressWarnings("unchecked")
public List<Topic> getLatestTopicsByForumId(int id, int number) {
return (List<Topic>) Q(
"from Topic t where t.forum.id = ?1 and t.invalid = 0 order by t.creationTime desc",
P(1, id)).setMaxResults(number).getResultList();
}
public String getHotString() {
if (isHot()) {
return "<FONT color=red>是</FONT>";
} else {
return "否";
}
}
public String getHiddenString() {
if (isHidden()) {
return "<FONT color=red>是</FONT>";
} else {
return "否";
}
}
// ------------------------------------------------
@SuppressWarnings("serial")
@Override
public String toString() {
return "area" + new LinkedHashMap<String, Object>() {
{
put("id", id);
put("name", name);
put("description", description);
put("hidden", hidden);
}
}.toString();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof Area) {
return ((Area) obj).getId() == this.getId();
}
return false;
}
public List<User> getWebmasters() {
return webmasters;
}
public void setWebmasters(List<User> webmasters) {
this.webmasters = webmasters;
}
}