Hibernate中的组件映射
今天学习了Hibernate组件映射。
?
(1)现在有一个表,要是字段很多,想把一些不是经常用到的字段分开的话,就需要一个类来存放这些字段。那如何去映射这之间的关系呢。
?
比如我们有一个用户表,里面的字段有 id(主键) ,name,password,email,phone,address.这时我把id,name,password经常用的放在User类中,而把剩下的放在Profile类中,当时User类中还用定义Profile并生成get/set方法,如果想通过Profile来访问User中的属性可以在Pfofile中定义User对象并生成get/set方法(这个不是必须的)
?
之后就是到User.hbm.xml设置
??? ??? <component name="profile(这个是在User类中定义的)" type="java.lang.String">
??? ??? ??? ??? <column name="email" length="200"></column>
??? ??? ??? </property>
??? ??? ??? <property name="phone" type="java.lang.String">
??? ??? ??? ??? <column name="phone" length="200"></column>
??? ??? ??? </property>
??? ??? ??? <property name="address" type="java.lang.String">
??? ??? ??? ??? <column name="address" length="200"></column>
??? ??? ??? </property>
??? ??? ??? <property name="mobile" type="java.lang.String">
??? ??? ??? ??? <column name="mobile" length="200"></column>
??? ??? ??? </property>
??? ??? </component>
?
完成这样的培训之后就可以正常的使用了。
??? public void save()
??? {
??? ??? Configuration config=new Configuration();
??? ??? config.configure();
??? ??? SessionFactory factory=config.buildSessionFactory();
??? ??? Session session=factory.openSession();
??? ??? User u=new User();
??? ??? Profile p=new Profile();
??? ???
??? ??? u.setPassword("1234");
??? ??? u.setUsername("1234");
??? ??? p.setAddress("hainan");
??? ??? p.setEmail("220201560");
??? ??? u.setProfile(p);
??? ???
??? ??? session.beginTransaction();
??? ??? session.save(u);
??? ??? session.getTransaction().commit();
??? }
}
?
?
(2)在下来讲一讲映射集合的内容
比如我们现在有两个表,属于一对多关系,分别为product表和img表
product中有的字段是id name price(float类型的)
img中有的字段是p_id(外键),filename,path
?
首先是分别生成对应的两个类Product类和Image类,在Pruduct中使用
??? private Set<Image> images=new HashSet(0);来声明Image类并且生成对应的get/set方法
?
然后在Product.hbm.xml文件中
?
??? ??? <set name="images(对应Product类中的Image集合)" table="img(对应数据库中的表)">
??? ??? <key column="p_id(这个是对应img表中的那个外键)" foreign-key="id" not-null="true"></key>
??? ??? <composite-element type="java.lang.String">
??? ??? ??? <column name="filename" length="200"></column>
??? ??? </property>
??? ??? <property name="path" type="java.lang.String">
??? ??? ??? <column name="path" length="200"></column>
??? ??? </property>
??? ??? </composite-element>
??? ??? </set>
?
简单的使用过程
?
??? public void addProduct()
??? {
??? ??? Configuration config=new Configuration();
??? ??? config.configure();
??? ??? SessionFactory factory=config.buildSessionFactory();
??? ??? Session session=factory.openSession();
??? ??? session.beginTransaction();
??? ??? Product p=new Product();
??? ??? p.setName("chengqing");
??? ??? p.setPrice(56.0);
??? ??? Image i1=new Image();
??? ??? Image i2=new Image();
??? ??? i1.setFilename("cheng");
??? ??? i1.setPath("eded");
??? ???
??? ??? i2.setFilename("hua");
??? ??? i2.setPath("sdsa");
??? ??? p.getImages().add(i1);
??? ??? p.getImages().add(i2);
??? ??? session.save(p);
??? ??? session.getTransaction().commit();
??? }
??? public void printProduct()
??? {
??? ??? Configuration config=new Configuration();
??? ??? config.configure();
??? ??? SessionFactory factory=config.buildSessionFactory();
??? ??? Session session=factory.openSession();
??? ??? session.beginTransaction();
??? ??? Product p=(Product) session.get(Product.class, new Integer(1));
??? ??? System.out.println(p.getName());
??? ??? Set<Image> images=p.getImages();
??? ??? for(Image img:images)
??? ??? {
??? ??? ??? System.out.println(img.getFilename());
??? ??? }
??? }