1.首先得有一个复合主键类CompositClassTest存在
CompositClassTest.java
package home.yhs.entity; import java.io.Serializable; public class CompositClassTest implements Serializable{ /** * */ private static final long serialVersionUID = -1605112043060635015L; String classId; String className; public String getClassId() { return classId; } public void setClassId(String classId) { this.classId = classId; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } }
注意:该类不需要单独的配置文件
2.其次得的有一个包含复合主键类(CompositClassTest)的类ClassTest存在
ClassTest.java:
package home.yhs.entity; public class ClassTest { CompositClassTest compositClassTest;//复合主键,用一个单独的类来表示 String num; public CompositClassTest getCompositClassTest() { return compositClassTest; } public void setCompositClassTest(CompositClassTest compositClassTest) { this.compositClassTest = compositClassTest; } public String getNum() { return num; } public void setNum(String num) { this.num = num; } }
对应的配置文件ClassTest.hbm.xml:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="home.yhs.entity.ClassTest" table = "classtest"> <composite-id name = "CompositClassTest" class = "home.yhs.entity.CompositClassTest"> <key-property name="classId"></key-property> <key-property name="className"></key-property>//这部分就是对应复合主键类的相关配置 </composite-id> <property name="num"></property> </class> </hibernate-mapping>
3.接下来有一个User.java类与对应的ClassTest类产生Many to one 的单向映射关系
User.java:
package home.yhs.entity; import java.util.Date; public class User { private String id; private String name; private String password;
private ClassTest classTest;//User类想要与ClassTest类达成单向映射的关系,必须包含ClassTest类的引用 public User() { super(); } public ClassTest getClassTest() { return classTest; } public void setClassTest(ClassTest classTest) { this.classTest = classTest; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
对应的配置文件User.hbm.xml:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="home.yhs.entity.User" table = "User"> <id name="id"> <generator class="assigned"/> </id> <property name="name"/> <property name="password"/> <many-to-one name="classTest" class="home.yhs.entity.ClassTest" cascade="all" unique="true" lazy="false"> <column name="classId"></column> <column name="className"></column> </many-to-one> </class> </hibernate-mapping>
4.最后再来一个测试类:
package home.yhs.util; import java.util.Date; import org.hibernate.Hibernate; import home.yhs.entity.ClassTest; import home.yhs.entity.CompositClassTest; import home.yhs.entity.User; public class Test { public static void main(String[] args) { CompositClassTest compositClassTest = new CompositClassTest(); compositClassTest.setClassId("3"); compositClassTest.setClassName("yhs"); ClassTest clasTest = new ClassTest(); clasTest.setCompositClassTest(compositClassTest);//添加复合主键到对应的类 clasTest.setNum("234"); // HibernateUtils.insert(clasTest); User user = new User(); user.setId("2"); user.setName("某某某"); user.setPassword("root"); user.setCreateTime(new Date()); user.setExpireTime(new Date()); user.setClassTest(clasTest); HibernateUtils.insert(user); /* User user = new User(); user.setId("4"); User user1 = (User) HibernateUtils.getById(User.class, user.getId()); System.out.println(user1.getClassTest().getNum());*/ }
}
注意:在实现User与ClassTest的单映射之后,在User执行插入操作的时候,会先到ClassTest对应的数据表中查找User对应的复合外键的数据行是否存在,如果存在则不再插入,如果不存在,则会先向ClassTest表中插入数据,然后再向User表中插入数据。