• hibernate4,onetomany


    项目搭建使用spring3 + hibernate4 + spring mvc 几个框架

    来说说hibernate4onetomany

    onetomany:应用场景如一个团队有很多玩家。
    贴代码:

    import java.util.Set;
    import javax.persistence.*;
    @Entity
    @Table(name = "teams")
    public class Team {
        @Id
        @GeneratedValue
        private Integer id;
        private String name;    
        @OneToMany(mappedBy="team", cascade=CascadeType.ALL)
        private Set<Player> players;
        public Team(){}
        public Team(String name) {
            this.name = name;
        }
            //省掉多余的get、set方法
        public Set<Player> getPlayers() {
            return players;
        }
    
        public void setPlayers(Set<Player> players) {
            this.players = players;
        }
    }
    import javax.persistence.*;
    @Entity
    @Table(name = "players")
    public class Player {
        @Id
        @GeneratedValue
        private Integer id;
        private String lastname;
        @ManyToOne
        @JoinColumn(name = "team_id")
        private Team team;
        public Player(){}
           //省掉get、set方法
        public Player(String lastname) {
            this.lastname = lastname;
        }
        public Team getTeam() {
            return team;
        }
        public void setTeam(Team team) {
            this.team = team;
        }
    }

    Test测试类,这里没有写单元测试,哪位哥们有时间,可以把单元测试贴出来:

    测试类里面session是open的,取完级联数据以后,才关闭。在web调用后台的时候,session在dao层进行关闭,controller层再取级联数据就会报出session已关闭的错误,我百度,goolge后,网上都说配置spring的请求过滤器,在请求时候把session来打开,但我试了,没测试通过。如果哪位大神找到解决办法,请不吝赐教。在这里谢谢了。

    import java.util.ArrayList;
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Set;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.stereotype.Repository;
    
    import com.ecoinfo.teaching.dao.FunTreeDao;
    import com.ecoinfo.teaching.dao.UserDao;
    import com.ecoinfo.teaching.vo.Article;
    import com.ecoinfo.teaching.vo.FunTree;
    import com.ecoinfo.teaching.vo.Player;
    import com.ecoinfo.teaching.vo.Team;
    import com.ecoinfo.teaching.vo.Users;
    import com.sun.mail.handlers.text_xml;
    
    /**
     * 测试保存一对多 多对多
     * @author 
     *
     */
    @Repository
    public class TestSaveObj {
    
        @Autowired
        private FunTreeDao funTreeDao;
        @Autowired
        private UserDao userDao;
        public void setFunTreeDao(FunTreeDao funTreeDao) {
            this.funTreeDao = funTreeDao;
        }
        public void setUsrDao(UserDao userDao) {
            this.userDao = userDao;
        }
        /**
         * 模拟数据
         * @param args
         */
        public static void main(String[] args) {
            ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-context.xml");
            SessionFactory sessionFactory = (SessionFactory) context.getBean("sessionFactory");
            Session session = sessionFactory.openSession();
            session.beginTransaction();
            System.out.println("程序开始执行.......");
            //onetoMany
            //addByOneToMany(session);
            //getByOneToMany(session);
            //deleteByOneToMany(session);
            //updateByOneToMany(session);
            session.close();
            System.out.println("程序结束执行.......");
            
        }
        /**
         * 一对多演示 add
         */
        public static void addByOneToMany(Session session){
            Team team = new Team("Barcelona");
            Set<Player> players = new HashSet<Player>();
            Player p1 = new Player("Messi");
            Player p2 = new Player("Xavi");
            p1.setTeam(team);
            p2.setTeam(team);
            players.add(p1);
            players.add(p2);
            team.setPlayers(players);
            session.save(team);
            session.getTransaction().commit();
        }
        public static void getByOneToMany(Session session){
            Team team = (Team) session.get(Team.class, 7);
            //可获得查询对象的内容
            System.out.println("team:"+team.getName());
            Iterator<Player> it = team.getPlayers().iterator();
            while(it.hasNext()){
                Player player = (Player)it.next();
                System.out.println(player.getLastname());
            }
        }
        public static void deleteByOneToMany(Session session){
            Team team = (Team) session.get(Team.class, 7);
            System.out.println(team.getName()+"对应集合大小:"+team.getPlayers().size());
            session.delete(team);
            session.getTransaction().commit();
        }
        public static void updateByOneToMany(Session session){
            Team team = new Team();
            team.setId(7);
            team.setName("updateBarcelona");
            session.update(team);
            session.getTransaction().commit();
        }

    以下是team和players表结构:

    CREATE TABLE `teams` (
      `id` int(10) unsigned NOT NULL auto_increment,
      `name` varchar(45) NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=gbk;
    CREATE TABLE `players` (
      `id` int(10) unsigned NOT NULL auto_increment,
      `lastname` varchar(45) NOT NULL,
      `team_id` int(10) unsigned NOT NULL,
      PRIMARY KEY  (`id`),
      KEY `FK_players_1` (`team_id`),
      CONSTRAINT `FK_players_1` FOREIGN KEY (`team_id`) REFERENCES `teams` (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=gbk;
    数据库用的mysql
  • 相关阅读:
    WinCE 测试网速
    YII 关联表查询
    YII CMenu配置
    php扩展开发笔记1
    使用Mysql EXPLAIN分析、优化SQL语句
    使用Mysql EXPLAIN分析、优化SQL语句 (续)
    jquery提交中文导致乱码
    *nix 命令记(持续更新)
    php 函数中使用static
    xmlhttprequest获取TransferEncoding:chunked分时编码输出
  • 原文地址:https://www.cnblogs.com/spp0152/p/3312633.html
Copyright © 2020-2023  润新知