2010年1月24日 星期日

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();
            }
        }
    }
}

2009年12月25日 星期五

2009年12月14日 星期一

2009年12月7日 星期一

Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream

小胖教我的
eclipse開發時, 用本機無法寄mail
當出現下面exception時
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream


C:\Program Files\MyEclipse 6.5\myeclipse\eclipse\plugins\com.genuitec.eclipse.j2eedt.core_6.5.0.zmyeclipse650200806\data\libraryset\EE_5\javaee.jar

把javaee.jar裡的
javax\activation\
javax\mail\
刪掉

clean eclipse  , build eclipse