// Path: jpa/namedquery/src/main/java/com/hantsylabs/example/ee7/Constants.java
// public class Constants {
//     public static final String NQ_COUNT_VOTE_UP="NQ_COUNT_VOTE_UP";
//     
// }
// 
// Path: jpa/unsynchronized/src/main/java/com/hantsylabs/example/ee7/jpa/Comment.java
// @Entity
// public class Comment implements Serializable {
// 
//     private static final long serialVersionUID = 1L;
//     @Id
//     @GeneratedValue(strategy = GenerationType.AUTO)
//     @Column(name = "ID")
//     private Long id;
// 
//     @Column(name = "CONTENT")
//     private String content;
//     
//     @ManyToOne()
//     @JoinColumn(name="POST_ID")
//     private Post post;
// 
//     public Comment() {
//     }
// 
//     public Comment(String commentBody) {
//         this.content=commentBody;
//     }
// 
//     public Long getId() {
//         return id;
//     }
// 
//     public void setId(Long id) {
//         this.id = id;
//     }
// 
//     public String getContent() {
//         return content;
//     }
// 
//     public void setContent(String content) {
//         this.content = content;
//     }
// 
//     public Post getPost() {
//         return post;
//     }
// 
//     public void setPost(Post post) {
//         this.post = post;
//     }
// 
//     @Override
//     public int hashCode() {
//         int hash = 7;
//         hash = 47 * hash + Objects.hashCode(this.id);
//         hash = 47 * hash + Objects.hashCode(this.content);
//         return hash;
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (obj == null) {
//             return false;
//         }
//         if (getClass() != obj.getClass()) {
//             return false;
//         }
//         final Comment other = (Comment) obj;
//         if (!Objects.equals(this.id, other.id)) {
//             return false;
//         }
//         if (!Objects.equals(this.content, other.content)) {
//             return false;
//         }
//         return true;
//     }
// 
//     @Override
//     public String toString() {
//         return "Comment{" + "id=" + id + ", content=" + content + '}';
//     }
// 
// }
// 
// Path: jpa/scripts/src/main/java/com/hantsylabs/example/ee7/jpa/Post.java
// @Entity
// @Table(name="POSTS")
// public class Post implements Serializable {
//     private static final long serialVersionUID = 1L;
//     @Id
//     @GeneratedValue(strategy = GenerationType.AUTO)
//     @Column(name="ID")
//     private Long id;
//     
//     @Column(name="TITLE")
//     private String title;
//     
//     @Column(name="BODY")
//     private String body;
//     
//     @Temporal(javax.persistence.TemporalType.DATE)
//     @Column(name="CREATED")
//     private Date created;
// 
//     public Long getId() {
//         return id;
//     }
// 
//     public void setId(Long id) {
//         this.id = id;
//     }
// 
//     public String getTitle() {
//         return title;
//     }
// 
//     public void setTitle(String title) {
//         this.title = title;
//     }
// 
//     public String getBody() {
//         return body;
//     }
// 
//     public void setBody(String body) {
//         this.body = body;
//     }
// 
//     public Date getCreated() {
//         return created;
//     }
// 
//     public void setCreated(Date created) {
//         this.created = created;
//     }
// 
//     @Override
//     public int hashCode() {
//         int hash = 0;
//         hash += (id != null ? id.hashCode() : 0);
//         return hash;
//     }
// 
//     @Override
//     public boolean equals(Object object) {
//         // TODO: Warning - this method won't work in the case the id fields are not set
//         if (!(object instanceof Post)) {
//             return false;
//         }
//         Post other = (Post) object;
//         if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
//             return false;
//         }
//         return true;
//     }
// 
//     @Override
//     public String toString() {
//         return "com.hantsylabs.example.ee7.jpa.Post[ id=" + id + " ]";
//     }
//     
// }


import com.hantsylabs.example.ee7.Constants;
import com.hantsylabs.example.ee7.jpa.Comment;
import com.hantsylabs.example.ee7.jpa.Post;
import com.hantsylabs.example.ee7.jpa.VoteDown;
import com.hantsylabs.example.ee7.jpa.VoteUp;
import java.util.logging.Logger;
import javax.ejb.Stateful;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

    public void init() {
        log.info("call init, id @" + id);
        if (id != null) {
            this.post = em.find(Post.class, this.id);
            fetchVoteUp();
            fetchVoteDown();
        } else {
            throw new RuntimeException("id is required");
        }
    }

    private void fetchVoteDown() {
        
//        Query query = em.createQuery("select count(vu)from Post p join treat(p.comments  as VoteDown) vu where p.id=:id");     
//        em.getEntityManagerFactory().addNamedQuery("NQ_COUNT_VOTE_UP", query);
        this.voteDown = ((Long) (em.createNamedQuery(Constants.NQ_COUNT_VOTE_UP)
                .setParameter("id", this.id)
                .getSingleResult())).intValue();
    }

    private void fetchVoteUp() {
        this.voteUp = ((Long) (em.createQuery("select count(vu)from Post p join treat(p.comments  as VoteUp) vu where p.id=:id")
                .setParameter("id", this.id)
                .getSingleResult())).intValue();
    }

    public void save() {
        final Comment comment = new Comment(this.commentBody);
        comment.setPost(this.post);
// Path: jpa/namedquery/src/main/java/com/hantsylabs/example/ee7/Constants.java
// public class Constants {
//     public static final String NQ_COUNT_VOTE_UP="NQ_COUNT_VOTE_UP";
//     
// }
// 
// Path: jpa/unsynchronized/src/main/java/com/hantsylabs/example/ee7/jpa/Comment.java
// @Entity
// public class Comment implements Serializable {
// 
//     private static final long serialVersionUID = 1L;
//     @Id
//     @GeneratedValue(strategy = GenerationType.AUTO)
//     @Column(name = "ID")
//     private Long id;
// 
//     @Column(name = "CONTENT")
//     private String content;
//     
//     @ManyToOne()
//     @JoinColumn(name="POST_ID")
//     private Post post;
// 
//     public Comment() {
//     }
// 
//     public Comment(String commentBody) {
//         this.content=commentBody;
//     }
// 
//     public Long getId() {
//         return id;
//     }
// 
//     public void setId(Long id) {
//         this.id = id;
//     }
// 
//     public String getContent() {
//         return content;
//     }
// 
//     public void setContent(String content) {
//         this.content = content;
//     }
// 
//     public Post getPost() {
//         return post;
//     }
// 
//     public void setPost(Post post) {
//         this.post = post;
//     }
// 
//     @Override
//     public int hashCode() {
//         int hash = 7;
//         hash = 47 * hash + Objects.hashCode(this.id);
//         hash = 47 * hash + Objects.hashCode(this.content);
//         return hash;
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (obj == null) {
//             return false;
//         }
//         if (getClass() != obj.getClass()) {
//             return false;
//         }
//         final Comment other = (Comment) obj;
//         if (!Objects.equals(this.id, other.id)) {
//             return false;
//         }
//         if (!Objects.equals(this.content, other.content)) {
//             return false;
//         }
//         return true;
//     }
// 
//     @Override
//     public String toString() {
//         return "Comment{" + "id=" + id + ", content=" + content + '}';
//     }
// 
// }
// 
// Path: jpa/scripts/src/main/java/com/hantsylabs/example/ee7/jpa/Post.java
// @Entity
// @Table(name="POSTS")
// public class Post implements Serializable {
//     private static final long serialVersionUID = 1L;
//     @Id
//     @GeneratedValue(strategy = GenerationType.AUTO)
//     @Column(name="ID")
//     private Long id;
//     
//     @Column(name="TITLE")
//     private String title;
//     
//     @Column(name="BODY")
//     private String body;
//     
//     @Temporal(javax.persistence.TemporalType.DATE)
//     @Column(name="CREATED")
//     private Date created;
// 
//     public Long getId() {
//         return id;
//     }
// 
//     public void setId(Long id) {
//         this.id = id;
//     }
// 
//     public String getTitle() {
//         return title;
//     }
// 
//     public void setTitle(String title) {
//         this.title = title;
//     }
// 
//     public String getBody() {
//         return body;
//     }
// 
//     public void setBody(String body) {
//         this.body = body;
//     }
// 
//     public Date getCreated() {
//         return created;
//     }
// 
//     public void setCreated(Date created) {
//         this.created = created;
//     }
// 
//     @Override
//     public int hashCode() {
//         int hash = 0;
//         hash += (id != null ? id.hashCode() : 0);
//         return hash;
//     }
// 
//     @Override
//     public boolean equals(Object object) {
//         // TODO: Warning - this method won't work in the case the id fields are not set
//         if (!(object instanceof Post)) {
//             return false;
//         }
//         Post other = (Post) object;
//         if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
//             return false;
//         }
//         return true;
//     }
// 
//     @Override
//     public String toString() {
//         return "com.hantsylabs.example.ee7.jpa.Post[ id=" + id + " ]";
//     }
//     
// }


// Path: jpa/namedquery/src/main/java/com/hantsylabs/example/ee7/jsf/ViewPostBean.java
import com.hantsylabs.example.ee7.Constants;
import com.hantsylabs.example.ee7.jpa.Comment;
import com.hantsylabs.example.ee7.jpa.Post;
import com.hantsylabs.example.ee7.jpa.VoteDown;
import com.hantsylabs.example.ee7.jpa.VoteUp;
import java.util.logging.Logger;
import javax.ejb.Stateful;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;


    public void init() {
        log.info("call init, id @" + id);
        if (id != null) {
            this.post = em.find(Post.class, this.id);
            fetchVoteUp();
            fetchVoteDown();
        } else {
            throw new RuntimeException("id is required");
        }
    }

    private void fetchVoteDown() {
        
//        Query query = em.createQuery("select count(vu)from Post p join treat(p.comments  as VoteDown) vu where p.id=:id");     
//        em.getEntityManagerFactory().addNamedQuery("NQ_COUNT_VOTE_UP", query);
        this.voteDown = ((Long) (em.createNamedQuery(Constants.NQ_COUNT_VOTE_UP)
                .setParameter("id", this.id)
                .getSingleResult())).intValue();
    }

    private void fetchVoteUp() {
        this.voteUp = ((Long) (em.createQuery("select count(vu)from Post p join treat(p.comments  as VoteUp) vu where p.id=:id")
                .setParameter("id", this.id)
                .getSingleResult())).intValue();
    }

    public void save() {
        final Comment comment = new Comment(this.commentBody);
        comment.setPost(this.post);
        this.post.getComments().add(comment);