在使用set集合时,如果集合中的元素是组件类或者是实体类,那么编写组件类或实体类时一定要实现equals()和hashCode()。
pom.xml: 4.0.0 hibernateTest hibernateTest 1.0-SNAPSHOT jar hibernateTest http://maven.apache.org junit junit 3.8.1 test org.hibernate hibernate-core 3.3.1.GA org.slf4j slf4j-nop 1.5.2 javassist javassist 3.4.GA c3p0 c3p0 0.9.1 com.oracle ojdbc14 10.2.0.3.0 runtime hibernateTest src/main/resources src/main/java **/*.java maven-compiler-plugin 1.6 1.6 UTF-8 resources/hibernate.cfg.xml: oracle.jdb c.driver.OracleDriver jdbc:oracle:thin:@l ocalhost:1521:XE true gbk system password 20 5 120 100 120 2 org.hibernate.dialect.OracleDialect true true pojo/Image.java: package pojo; public class Image { private String name; private String fileName; private int sizeX; private int sizeY; private Item item; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } public int getSizeX() { return sizeX; } public void setSizeX(int sizeX) { this.sizeX = sizeX; } public int getSizeY() { return sizeY; } public void setSizeY(int sizeY) { this.sizeY = sizeY; } public Item getItem() { return item; } public void setItem(Item item) { this.item = item; } //注意!这里加了hashCode()的实现 @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((fileName == null) ? 0 : fileName.hashCode()); result = prime * result + ((item == null) ? 0 : item.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + sizeX; result = prime * result + sizeY; return result; } //注意!这里加了equals()方法的实现 @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Image other = (Image) obj; if (fileName == null) { if (other.fileName != null) return false; } else if (!fileName.equals(other.fileName)) return false; if (item == null) { if (other.item != null) return false; } else if (!item.equals(other.item)) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (sizeX != other.sizeX) return false; if (sizeY != other.sizeY) return false; return true; } } pojo/Item.java: package pojo; import java.io.Serializable; import java.util.HashSet; import java.util.Set; public class Item implements Serializable{ private String id; private String name; //请注意这一行 private Set imageSet = new HashSet(); public String getId() { return id; } @SuppressWarnings("unused") private void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set getImageSet() { return imageSet; } public void setImageSet(Set imageSet) { this.imageSet = imageSet; } } pojo/Item.hbm.xml: 注意:中的property中都必须加not-null="true" util/HibernateUtil.java: package util; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtil { private static SessionFactory sessionFactory; static{ try { sessionFactory = new Configuration().configure().buildSessionFactory(); } catch (Throwable e) { throw new ExceptionInInitializerError(e); } } public static SessionFactory getSessionFactory(){ return sessionFactory; } public static void shutdown(){ getSessionFactory().close(); } } util/Manager.java: package util; import java.util.HashSet; import java.util.Set; import org.hibernate.Session; import org.hibernate.Transaction; import pojo.Image; import pojo.Item; public class Manager { public static void main(String[] args) { Image image1 = new Image(); image1.setFileName("aaa.jpg"); image1.setName("aaa"); image1.setSizeX(400); image1.setSizeY(400); Image image2 = new Image(); image2.setFileName("bbb.jpg"); image2.setName("bbb"); image2.setSizeX(500); image2.setSizeY(500); Set s = new HashSet(); s.add(image1); s.add(image2); Item it = new Item(); it.setName("fuhaidong"); it.setImageSet(s); Session session = HibernateUtil.getSessionFactory().openSession(); Transaction transaction = session.beginTransaction(); session.save(it); Item item = (Item) session.get(Item.class, "402881832b1ef269012b1ef26acc0001"); Image image3 = item.getImageSet().iterator().next(); System.out.println(image3.getFileName()); System.out.println(image3.getItem().getName()); transaction.commit(); session.close(); } } 表结构: ITEM表: ITEM_ID, ITEM_NAME ITEM_IMAGE表: ITEM_ID, IMAGENAME, FILENAME, SIZEX, SIZEY 输出sql与日志: Hibernate: select item0_.ITEM_ID as ITEM1_0_0_, item0_.ITEM_NAME as ITEM2_0_0_ from ITEM item0_ where item0_.ITEM_ID=? Hibernate: select imageset0_.ITEM_ID as ITEM1_0_, imageset0_.IMAGENAME as IMAGENAME0_, imageset0_.FILENAME as FILENAME0_, imageset0_.SIZEX as SIZEX0_, imageset0_.SIZEY as SIZEY0_ from ITEM_IMAGE imageset0_ where imageset0_.ITEM_ID=? aaa.jpg fuhaidong Hibernate: insert into ITEM (ITEM_NAME, ITEM_ID) values (?, ?) Hibernate: insert into ITEM_IMAGE (ITEM_ID, IMAGENAME, FILENAME, SIZEX, SIZEY) values (?, ?, ?, ?, ?) Hibernate: insert into ITEM_IMAGE (ITEM_ID, IMAGENAME, FILENAME, SIZEX, SIZEY) values (?, ?, ?, ?, ?) 上例中,Image是Item的一个组件,Item则是负责Image实例的生命周期的实体。
首先,把Image类实现为一般的POJO。由于组件类没有标识符属性,你必须实现equals()(和hashCode()),并比较name,fileName,sizeX,sizeY属性。hibernate依赖这个等同性子程序检查实例中的修改。并非所有的组件类都需要equals()和hashCode()的定制实现。但是,我们建议把它用于任何组件类,因为这种实现很简单,并且"小心不出大错"可是至理名言。
组件的集合被类似地映射到JDK值类型的集合。唯一的区别是用代替了标签。
这是一个集,因此集合表的主键是键列和所有元素列的一个复合。ITEM_ID,IMAGENAME,FILENAME,SIZEX,SIXEY。因为这些列都出现在主键中,需要用not-null="true"声明它们。复合主键中任何列都不可以为空---因为你无法辨别不知道的东西,这可能是这个特定映射的一个缺点。
pom.xml: 4.0.0 hibernateTest hibernateTest 1.0-SNAPSHOT jar hibernateTest http://maven.apache.org junit junit 3.8.1 test org.hibernate hibernate-core 3.3.1.GA org.slf4j slf4j-nop 1.5.2 javassist javassist 3.4.GA c3p0 c3p0 0.9.1 com.oracle ojdbc14 10.2.0.3.0 runtime hibernateTest src/main/resources src/main/java **/*.java maven-compiler-plugin 1.6 1.6 UTF-8 resources/hibernate.cfg.xml: oracle.jdb c.driver.OracleDriver jdbc:oracle:thin:@l ocalhost:1521:XE true gbk system password 20 5 120 100 120 2 org.hibernate.dialect.OracleDialect true true pojo/Image.java: package pojo; public class Image { private String name; private String fileName; private int sizeX; private int sizeY; private Item item; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } public int getSizeX() { return sizeX; } public void setSizeX(int sizeX) { this.sizeX = sizeX; } public int getSizeY() { return sizeY; } public void setSizeY(int sizeY) { this.sizeY = sizeY; } public Item getItem() { return item; } public void setItem(Item item) { this.item = item; } //注意!这里加了hashCode()的实现 @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((fileName == null) ? 0 : fileName.hashCode()); result = prime * result + ((item == null) ? 0 : item.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + sizeX; result = prime * result + sizeY; return result; } //注意!这里加了equals()方法的实现 @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Image other = (Image) obj; if (fileName == null) { if (other.fileName != null) return false; } else if (!fileName.equals(other.fileName)) return false; if (item == null) { if (other.item != null) return false; } else if (!item.equals(other.item)) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (sizeX != other.sizeX) return false; if (sizeY != other.sizeY) return false; return true; } } pojo/Item.java: package pojo; import java.io.Serializable; import java.util.HashSet; import java.util.Set; public class Item implements Serializable{ private String id; private String name; //请注意这一行 private Set imageSet = new HashSet(); public String getId() { return id; } @SuppressWarnings("unused") private void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set getImageSet() { return imageSet; } public void setImageSet(Set imageSet) { this.imageSet = imageSet; } } pojo/Item.hbm.xml: 注意:中的property中都必须加not-null="true" util/HibernateUtil.java: package util; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtil { private static SessionFactory sessionFactory; static{ try { sessionFactory = new Configuration().configure().buildSessionFactory(); } catch (Throwable e) { throw new ExceptionInInitializerError(e); } } public static SessionFactory getSessionFactory(){ return sessionFactory; } public static void shutdown(){ getSessionFactory().close(); } } util/Manager.java: package util; import java.util.HashSet; import java.util.Set; import org.hibernate.Session; import org.hibernate.Transaction; import pojo.Image; import pojo.Item; public class Manager { public static void main(String[] args) { Image image1 = new Image(); image1.setFileName("aaa.jpg"); image1.setName("aaa"); image1.setSizeX(400); image1.setSizeY(400); Image image2 = new Image(); image2.setFileName("bbb.jpg"); image2.setName("bbb"); image2.setSizeX(500); image2.setSizeY(500); Set s = new HashSet(); s.add(image1); s.add(image2); Item it = new Item(); it.setName("fuhaidong"); it.setImageSet(s); Session session = HibernateUtil.getSessionFactory().openSession(); Transaction transaction = session.beginTransaction(); session.save(it); Item item = (Item) session.get(Item.class, "402881832b1ef269012b1ef26acc0001"); Image image3 = item.getImageSet().iterator().next(); System.out.println(image3.getFileName()); System.out.println(image3.getItem().getName()); transaction.commit(); session.close(); } } 表结构: ITEM表: ITEM_ID, ITEM_NAME ITEM_IMAGE表: ITEM_ID, IMAGENAME, FILENAME, SIZEX, SIZEY 输出sql与日志: Hibernate: select item0_.ITEM_ID as ITEM1_0_0_, item0_.ITEM_NAME as ITEM2_0_0_ from ITEM item0_ where item0_.ITEM_ID=? Hibernate: select imageset0_.ITEM_ID as ITEM1_0_, imageset0_.IMAGENAME as IMAGENAME0_, imageset0_.FILENAME as FILENAME0_, imageset0_.SIZEX as SIZEX0_, imageset0_.SIZEY as SIZEY0_ from ITEM_IMAGE imageset0_ where imageset0_.ITEM_ID=? aaa.jpg fuhaidong Hibernate: insert into ITEM (ITEM_NAME, ITEM_ID) values (?, ?) Hibernate: insert into ITEM_IMAGE (ITEM_ID, IMAGENAME, FILENAME, SIZEX, SIZEY) values (?, ?, ?, ?, ?) Hibernate: insert into ITEM_IMAGE (ITEM_ID, IMAGENAME, FILENAME, SIZEX, SIZEY) values (?, ?, ?, ?, ?) 上例中,Image是Item的一个组件,Item则是负责Image实例的生命周期的实体。
首先,把Image类实现为一般的POJO。由于组件类没有标识符属性,你必须实现equals()(和hashCode()),并比较name,fileName,sizeX,sizeY属性。hibernate依赖这个等同性子程序检查实例中的修改。并非所有的组件类都需要equals()和hashCode()的定制实现。但是,我们建议把它用于任何组件类,因为这种实现很简单,并且"小心不出大错"可是至理名言。
组件的集合被类似地映射到JDK值类型的集合。唯一的区别是用代替了标签。
这是一个集,因此集合表的主键是键列和所有元素列的一个复合。ITEM_ID,IMAGENAME,FILENAME,SIZEX,SIXEY。因为这些列都出现在主键中,需要用not-null="true"声明它们。复合主键中任何列都不可以为空---因为你无法辨别不知道的东西,这可能是这个特定映射的一个缺点。