2010年1月24日 星期日

Hibernate Annotation Many2OneUnidirectAssociationJoin

Member


package com.todd.bean;

import java.io.Serializable;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
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.Table;


@Entity
@Table(name = "many2one_unidirect_association_join_member")
public class Many2OneUnidirectAssociationJoinMember implements Serializable{

    private int member_id;
    private String user_id;
    private String user_name;
    private String member_desc;

    private Many2OneUnidirectAssociationJoinSkill skill;
   
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "member_id")   
    public int getMember_id() {
        return member_id;
    }
    public void setMember_id(int member_id) {
        this.member_id = member_id;
    }
   
    @Column(name = "user_id")
    public String getUser_id() {
        return user_id;
    }
    public void setUser_id(String user_id) {
        this.user_id = user_id;
    }

    @Column(name = "user_name")
    public String getUser_name() {
        return user_name;
    }
    public void setUser_name(String user_name) {
        this.user_name = user_name;
    }

   
    @Column(name = "member_desc")
    public String getMember_desc() {
        return member_desc;
    }
    public void setMember_desc(String member_desc) {
        this.member_desc = member_desc;
    }


   
    @ManyToOne(optional=true)
    @JoinTable(name = "many2one_unidirect_association_join_member_skill",
        joinColumns = {
            @JoinColumn(name="fk_member_id", unique = true)           
        },
        inverseJoinColumns = {
            @JoinColumn(name="fk_skill_id")
        }
    )
    public Many2OneUnidirectAssociationJoinSkill getSkill() {
        return skill;
    }
    public void setSkill(Many2OneUnidirectAssociationJoinSkill skill) {
        this.skill = skill;
    }
}

Skill


package com.todd.bean;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;


@Entity
@Table(name = "many2one_unidirect_association_join_skill")
public class Many2OneUnidirectAssociationJoinSkill implements Serializable{

    private int skill_id;
    private String user_id;
    private String skill;
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "skill_id")    
    public int getSkill_id() {
        return skill_id;
    }
    public void setSkill_id(int skill_id) {
        this.skill_id = skill_id;
    }
    
    @Column(name = "user_id")
    public String getUser_id() {
        return user_id;
    }
    public void setUser_id(String user_id) {
        this.user_id = user_id;
    }
    
    @Column(name = "skill")
    public String getSkill() {
        return skill;
    }
    public void setSkill(String skill) {
        this.skill = skill;
    }
}

Test


package com.todd.bean;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;

import junit.framework.TestCase;

import com.todd.HibernateAnnotationHelper;

/**
 * 1.多個member 有共同的 skill時
 * 2.
 * @author Todd
 */
public class Many2OneUnidirectAssociationJoinMyTestCaseA extends TestCase {


    public void test(){
       
        Session session = HibernateAnnotationHelper.getSessionFactory().openSession();       
        Transaction tx = session.beginTransaction();

        Many2OneUnidirectAssociationJoinMember member1 = new Many2OneUnidirectAssociationJoinMember();
        member1.setUser_id("ots520");
        member1.setUser_name("ots520");
        member1.setMember_desc("ots520 desc1");

        Many2OneUnidirectAssociationJoinMember member2 = new Many2OneUnidirectAssociationJoinMember();
        member2.setUser_id("todd");
        member2.setUser_name("todd");
        member2.setMember_desc("ots520 desc2");

       
        Many2OneUnidirectAssociationJoinSkill skill = new Many2OneUnidirectAssociationJoinSkill();
        skill.setUser_id("這情況應該不用有 user_id了吧");
        skill.setSkill("ass");
        session.save(skill);
       
        member1.setSkill(skill);
        member2.setSkill(skill);
        session.save(member1);
        session.save(member2);
       
       
       
        Many2OneUnidirectAssociationJoinMember JoinMember = (Many2OneUnidirectAssociationJoinMember) session.get(Many2OneUnidirectAssociationJoinMember.class, 7);
        if(!(JoinMember == null)){
            System.out.println("JoinMember=" + JoinMember.getSkill().getSkill_id());
        }
       
        tx.commit();
        session.close();       
       
    }
}

Hibernate Annotation Many2OneUnidirectAssociationFk

Member


package com.todd.bean;

import java.io.Serializable;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;


@Entity
@Table(name = "many2one_unidirect_association_fk_member")
public class Many2OneUnidirectAssociationFkMember implements Serializable{

    private int memberId;
    private String userId;
    private String userName;
    private String memberDesc;

    private Many2OneUnidirectAssociationFkSkill skill;
   
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "member_id")   
    public int getMemberId() {
        return memberId;
    }
    public void setMemberId(int memberId) {
        this.memberId = memberId;
    }
   
    @Column(name = "user_id")
    public String getUserId() {
        return userId;
    }
    public void setUserId(String userId) {
        this.userId = userId;
    }
   
    @Column(name = "user_name")
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
   
    @Column(name = "member_desc")
    public String getMemberDesc() {
        return memberDesc;
    }
    public void setMemberDesc(String memberDesc) {
        this.memberDesc = memberDesc;
    }
   
    @ManyToOne
    @JoinColumn(name = "skill_id") // watch out! 指定 一方 的對應key
    public Many2OneUnidirectAssociationFkSkill getSkill() {
        return skill;
    }
    public void setSkill(Many2OneUnidirectAssociationFkSkill skill) {
        this.skill = skill;
    }
}

Skill


package com.todd.bean;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;


@Entity
@Table(name = "many2one_unidirect_association_fk_skill")
public class Many2OneUnidirectAssociationFkSkill implements Serializable{

    private int skillId;
    private String userId;
    private String skill;
   
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "skill_id")   
    public int getSkillId() {
        return skillId;
    }
    public void setSkillId(int skillId) {
        this.skillId = skillId;
    }
   
    @Column(name = "user_id")
    public String getUserId() {
        return userId;
    }
    public void setUserId(String userId) {
        this.userId = userId;
    }

    @Column(name = "skill")
    public String getSkill() {
        return skill;
    }
    public void setSkill(String skill) {
        this.skill = skill;
    }
}

Test


package com.todd.bean;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;

import junit.framework.TestCase;

import com.todd.HibernateAnnotationHelper;

/**
 * 1.
 * 2.
 * @author Todd
 */
public class Many2OneUnidirectAssociationFkMyTestCaseA extends TestCase {


    public void test(){
       
        Session session = HibernateAnnotationHelper.getSessionFactory().openSession();       
        Transaction tx = session.beginTransaction();

        Many2OneUnidirectAssociationFkSkill skill = new Many2OneUnidirectAssociationFkSkill();
        skill.setUserId("這情況就不須這欄位了吧");
        skill.setSkill("skill");
        session.save(skill);
       
        Many2OneUnidirectAssociationFkMember member1 = new Many2OneUnidirectAssociationFkMember();
        member1.setUserId("ots520");
        member1.setUserName("ots520");
        member1.setMemberDesc("ots520 desc");
        member1.setSkill(skill);
       
        Many2OneUnidirectAssociationFkMember member2 = new Many2OneUnidirectAssociationFkMember();
        member2.setUserId("todd");
        member2.setUserName("todd name");
        member2.setMemberDesc("todd desc");
        member2.setSkill(skill);
       
        session.save(member1);
        session.save(member2);
       
        tx.commit();
        session.close();       
       
    }

}

Hibernate Annotation Many2ManyUnidirectAssociationJoin

Member


package com.todd.bean;

import java.io.Serializable;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
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.OneToMany;
import javax.persistence.Table;


@Entity
@Table(name = "many2many_unidirect_association_join_member")
public class Many2ManyUnidirectAssociationJoinMember implements Serializable{

    private int memberId;
    private String userId;
    private String userName;
    private String memberDesc;

    private List skillList;
   
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "member_id")   
    public int getMemberId() {
        return memberId;
    }
    public void setMemberId(int memberId) {
        this.memberId = memberId;
    }
   
    @Column(name = "user_id")
    public String getUserId() {
        return userId;
    }
    public void setUserId(String userId) {
        this.userId = userId;
    }
   
    @Column(name = "user_name")
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
   
    @Column(name = "member_desc")
    public String getMemberDesc() {
        return memberDesc;
    }
    public void setMemberDesc(String memberDesc) {
        this.memberDesc = memberDesc;
    }

   
    @ManyToMany
    @JoinTable(name = "many2many_unidirect_association_join_member_skill",
        joinColumns = {
            @JoinColumn(name="fk_member_id")          
        },
        inverseJoinColumns = {
            @JoinColumn(name="fk_skill_id")
        }
    )
    public List getSkillList() {
        return skillList;
    }
    public void setSkillList(List skillList) {
        this.skillList = skillList;
    }   
}


Skill


package com.todd.bean;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;


@Entity
@Table(name = "many2many_unidirect_association_join_skill")
public class Many2ManyUnidirectAssociationJoinSkill implements Serializable{

    private int skillId;
    private String userId;
    private String skill;
   
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "skill_id")   
    public int getSkillId() {
        return skillId;
    }
    public void setSkillId(int skillId) {
        this.skillId = skillId;
    }
   
    @Column(name = "user_id")
    public String getUserId() {
        return userId;
    }
    public void setUserId(String userId) {
        this.userId = userId;
    }

    @Column(name = "skill")
    public String getSkill() {
        return skill;
    }
    public void setSkill(String skill) {
        this.skill = skill;
    }
}

Test


package com.todd.bean;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;

import junit.framework.TestCase;

import com.todd.HibernateAnnotationHelper;

/**
 * 1.多對多的意義是?
 * 2.
 * @author Todd
 */
public class Many2ManyUnidirectAssociationJoinMyTestCaseA extends TestCase {


    public void test(){
       
        Session session = HibernateAnnotationHelper.getSessionFactory().openSession();       
        Transaction tx = session.beginTransaction();

        Many2ManyUnidirectAssociationJoinMember member1 = new Many2ManyUnidirectAssociationJoinMember();
        member1.setUserId("ots520");
        member1.setUserName("ots520");
        member1.setMemberDesc("ots520 desc");
       
        Many2ManyUnidirectAssociationJoinMember member2 = new Many2ManyUnidirectAssociationJoinMember();
        member2.setUserId("todd");
        member2.setUserName("todd name");
        member2.setMemberDesc("todd desc");

       
        List skillList = new ArrayList();
       
        Many2ManyUnidirectAssociationJoinSkill skill1 = new Many2ManyUnidirectAssociationJoinSkill();
        skill1.setUserId("none");
        skill1.setSkill("skill1");
        session.save(skill1);
        skillList.add(skill1);
       
        Many2ManyUnidirectAssociationJoinSkill skill2 = new Many2ManyUnidirectAssociationJoinSkill();
        skill2.setUserId("none");
        skill2.setSkill("skill2");
        session.save(skill2);
        skillList.add(skill2);

       
        member1.setSkillList(skillList);
        member2.setSkillList(skillList);
        session.save(member1);
        session.save(member2);
       
        tx.commit();
        session.close();       
       
    }
}

Hibernate Annotation Many2ManyBidirectAssociationJoin

Member


package com.todd.bean;

import java.io.Serializable;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
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.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;


@Entity
@Table(name = "many2many_bidirect_association_join_member")
public class Many2ManyBidirectAssociationJoinMember implements Serializable{

    private int memberId;
    private String userId;
    private String userName;
    private String memberDesc;

    private List skillList;
   
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "member_id")   
    public int getMemberId() {
        return memberId;
    }
    public void setMemberId(int memberId) {
        this.memberId = memberId;
    }
   
    @Column(name = "user_id")
    public String getUserId() {
        return userId;
    }
    public void setUserId(String userId) {
        this.userId = userId;
    }
   
    @Column(name = "user_name")
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
   
    @Column(name = "member_desc")
    public String getMemberDesc() {
        return memberDesc;
    }
    public void setMemberDesc(String memberDesc) {
        this.memberDesc = memberDesc;
    }
   
    //@ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
    @ManyToMany
    @org.hibernate.annotations.Cascade( value = org.hibernate.annotations.CascadeType.SAVE_UPDATE )
    @JoinTable(name = "many2many_bidirect_association_join_member_skill",
        joinColumns = {
            @JoinColumn(name="fk_member_id")          
        },
        inverseJoinColumns = {
            @JoinColumn(name="fk_skill_id")
        }
    )
    public List getSkillList() {
        return skillList;
    }
    public void setSkillList(List skillList) {
        this.skillList = skillList;
    }
}


Skill


package com.todd.bean;

import java.io.Serializable;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table;


@Entity
@Table(name = "many2many_bidirect_association_join_skill")
public class Many2ManyBidirectAssociationJoinSkill implements Serializable{

    private int skillId;
    private String userId;
    private String skill;
   
    private List memberList;
   
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "skill_id")   
    public int getSkillId() {
        return skillId;
    }
    public void setSkillId(int skillId) {
        this.skillId = skillId;
    }
   
    @Column(name = "user_id")
    public String getUserId() {
        return userId;
    }
    public void setUserId(String userId) {
        this.userId = userId;
    }

    @Column(name = "skill")
    public String getSkill() {
        return skill;
    }
    public void setSkill(String skill) {
        this.skill = skill;
    }
   
//    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE }, mappedBy="skillList")
    @ManyToMany(mappedBy="skillList")
    @org.hibernate.annotations.Cascade( value = org.hibernate.annotations.CascadeType.SAVE_UPDATE )
    public List getMemberList() {
        return memberList;
    }
    public void setMemberList(
            List memberList) {
        this.memberList = memberList;
    }
}


Test


package com.todd.bean;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;

import junit.framework.TestCase;

import com.todd.HibernateAnnotationHelper;

/**
 * 1.
 * 2.
 * @author Todd
 */
public class Many2ManyBidirectAssociationJoinMyTestCaseA extends TestCase {


    public void test(){
       
        Session session = HibernateAnnotationHelper.getSessionFactory().openSession();       
        Transaction tx = session.beginTransaction();

        List memberList = new ArrayList();
        List skillList = new ArrayList();
       
        Many2ManyBidirectAssociationJoinMember member1 = new Many2ManyBidirectAssociationJoinMember();
        member1.setUserId("ots520");
        member1.setUserName("ots520");
        member1.setMemberDesc("ots520 desc");
        memberList.add(member1);
       
       
        Many2ManyBidirectAssociationJoinMember member2 = new Many2ManyBidirectAssociationJoinMember();
        member2.setUserId("todd");
        member2.setUserName("todd name");
        member2.setMemberDesc("todd desc");
        memberList.add(member2);

        Many2ManyBidirectAssociationJoinSkill skill1 = new Many2ManyBidirectAssociationJoinSkill();
        skill1.setUserId("none");
        skill1.setSkill("skill1");
        skill1.setMemberList(memberList);
        skillList.add(skill1);
       
        Many2ManyBidirectAssociationJoinSkill skill2 = new Many2ManyBidirectAssociationJoinSkill();
        skill2.setUserId("none");
        skill2.setSkill("skill2");
        skill2.setMemberList(memberList);
        skillList.add(skill2);

        skill1.setMemberList(memberList);
        skill2.setMemberList(memberList);
        member1.setSkillList(skillList);
        member2.setSkillList(skillList);
       
        session.save(member1);
        session.save(member2);
       
       
        tx.commit();
        session.close();       
       
    }
}

2010年1月12日 星期二

2010年1月11日 星期一

Hibernate OpenSessionInView

1.設了 OpenSessionInViewFilter 後, mysql裡的connection pool都沒作用, 連線一直增加
       
            把 singleSession 改成 true
            但web.xml裡的singleSession 設為true後, 會有交易的問題, 去sping-hibernate.xml裡, 有查詢類的method要加上readonly,
            並把有用到的dao加入org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator

            org.springframework.dao.InvalidDataAccessApiUsageException:
            Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL):
            Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.

2.把PageViewMonthDAO加入交易後, 會出現下列問題
            org.springframework.orm.hibernate3.HibernateSystemException:
            a different object with the same identifier value was already associated with the session:
             [com.xxx.db.hibernate.pojo.PageViewMonth#200912];
           
             nested exception is org.hibernate.NonUniqueObjectException:
             a different object with the same identifier value was already associated with the session:
             [com.xxx.db.hibernate.pojo.PageViewMonth#200912]

            改成 getHibernateTemplate().merge();
           
            session.merge() 方法的註釋:
            Copy the state of the given object onto the persistent object with the same identifier.
            If there is no persistent instance currently associated with the session,
            it will be loaded. Return the persistent instance.
            If the given instance is unsaved, save a copy of and return it as a newly persistent instance.
            The given instance does not become associated with the session.
            This operation cascades to associated instances if the association is mapped with cascade="merge".
            The semantics of this method are defined by JSR-220.

ExecutorService, Callable

謝小胖老師指導



import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

import org.apache.commons.httpclient.HttpClient;

public class TestHttpClients2 implements Callable {
   
    private String sResult;
    private String userId;
   
    public TestHttpClients2(String userId) {
        this.userId = userId;
    }
 
    public String call() throws Exception {
        //logic
        Thread.sleep(1000);
        return sResult;
    }
   
    public static void main(String[] args) {
       
        ExecutorService pool = Executors.newFixedThreadPool(3);
        Set> set = new HashSet>();

        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader(new File("C:\\xxx\\xxx.txt")));
            while (br.ready()) {
                   Callable callable = new TestHttpClients2(String.valueOf(br.readLine()));
                   Future future = pool.submit(callable);
                   set.add(future);
            }
           
            for (Future future : set) {
                System.out.println("future=" + future.get());
                System.out.println("future isDone=" + future.isDone());
            }
           
            //logic
           
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (br != null)
                    br.close();
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        }
    }
}