package br.com.triadworks.issuetracker.model; import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; import javax.persistence.EnumType; import javax.persistence.Enumerated; 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.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.PostLoad; import javax.persistence.PrePersist; import javax.persistence.PreUpdate; import javax.persistence.SequenceGenerator; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity @EntityListeners({IssuePostLoad.class}) public class Issue implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_ISSUE") @SequenceGenerator(name="SEQ_ISSUE", sequenceName="SEQ_ISSUE", allocationSize=1) private Long id; private String sumario; @Column(length=1000) private String descricao; @ManyToOne private Projeto projeto; @Enumerated(EnumType.STRING) private TipoDaIssue tipo; @Temporal(TemporalType.TIMESTAMP) private Date reportadoEm; @ManyToOne @JoinColumn(name="USUARIO_REPORTADOR") private Usuario reportadoPor; @ManyToOne @JoinColumn(name="ASSINADO_PARA", referencedColumnName="USU_LOGIN") private Usuario assinadoPara; @Temporal(TemporalType.TIMESTAMP) private Date atualizadoEm; @Enumerated(EnumType.STRING) private Status status; // EAGER e LAZY @OneToMany(cascade=CascadeType.ALL, orphanRemoval=true, fetch=FetchType.LAZY) @JoinTable(name="ISSUE_COMENTARIO", joinColumns=@JoinColumn(name="ISSUE_ID"), inverseJoinColumns=@JoinColumn(name="COMENTARIO_ID")) private List<Comentario> comentarios = new ArrayList<Comentario>(); public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getSumario() { return sumario; } public void setSumario(String sumario) { this.sumario = sumario; } public String getDescricao() { return descricao; } public void setDescricao(String descricao) { this.descricao = descricao; } public Projeto getProjeto() { return projeto; } public void setProjeto(Projeto projeto) { this.projeto = projeto; } public TipoDaIssue getTipo() { return tipo; } public void setTipo(TipoDaIssue tipo) { this.tipo = tipo; } public Date getReportadoEm() { return reportadoEm; } public void setReportadoEm(Date reportadoEm) { this.reportadoEm = reportadoEm; } public Usuario getReportadoPor() { return reportadoPor; } public void setReportadoPor(Usuario reportadoPor) { this.reportadoPor = reportadoPor; } public Usuario getAssinadoPara() { return assinadoPara; } public void setAssinadoPara(Usuario assinadoPara) { this.assinadoPara = assinadoPara; } public Date getAtualizadoEm() { return atualizadoEm; } public void setAtualizadoEm(Date atualizadoEm) { this.atualizadoEm = atualizadoEm; } public List<Comentario> getComentarios() { return Collections.unmodifiableList(comentarios); // return comentarios; } public void setComentarios(List<Comentario> comentarios) { this.comentarios = comentarios; } public Status getStatus() { return status; } public void setStatus(Status status) { this.status = status; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.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; Issue other = (Issue) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; } public void adicionaComentario(Comentario comentario) { if (comentario.getAutor() == null) throw new IllegalArgumentException("Autor nao pode ser vazio."); this.getComentarios().add(comentario); } public void fecha(Comentario comentario) { this.status = Status.FECHADA; this.adicionaComentario(comentario); this.atualizadoEm = new Date(); } @PrePersist @PreUpdate public void atualizaData() { System.out.println(">>> @PrePersist"); this.atualizadoEm = new Date(); } @PostLoad public void onPostLoad() { // System.out.println(">>> @PostLoad"); } }