Hibernate 映射

来源:互联网 发布:实况2017拉什福德数据 编辑:程序博客网 时间:2024/05/16 01:53

Many-to-one  单向

public class Group {

    private int id ;

    private String name ;

 

public class User {

    private int id ;

    private String name ;

    private Group group ;

 

    <class name="User" table="t_user">

       <id name="id">

           <generator class="native"/>

       </id>

       <property name="name" />

       <many-to-one name="group" column="groupid"></many-to-one>

    </class>

 

    <class name="Group" table="t_group">

       <id name="id">

           <generator class="native"/>

       </id>

       <property name="name"/>

    </class>

 

// many-to-one 在多的一端加了一个外键 所以能取到group

       User user = (User) session.load(User.class, 1) ;

       System.out.println(user.getName());

       System.out.println(user.getGroup().getName());

 

One-to-one 单向主键

public class IdCard {

    private int id ;

    private String cardNO ;

 

public class Person {

    private int id ;

    private String name ;

    private IdCard idCard ;

 

    <class name="IdCard" table="t_idCard">

       <id name="id">

           <generator class="native"/>

       </id>

       <property name="cardNO" />

    </class>

 

    <class name="Person" table="t_person">

    <!-- person 主键来自于外键  idCard属性中的主键 -->

       <id name="id">

           <generator class="foreign">

           <param name="property">idCard</param>

           </generator>

       </id>

       <property name="name" />

       <!-- constrained 表明当前主键存在一个约束

           person的主键作为外键参照了idCard

        -->

    <one-to-one name="idCard" constrained="true"></one-to-one>

    </class>

 

       // 可以加载

       // 根据外键id  查询另一个表中的数据

    Person person = (Person)session.load(Person.class, 1) ;

    System.out.println(person.getIdCard().getCardNO());

 

       IdCard idCard = new IdCard() ;

       idCard.setCardNO("dddddddddddddddd") ;

       Person person = new Person() ;

       person.setIdCard(idCard) ;

       person.setName("张三丰") ;

       // 可以正常保存 一对一映射hibernate已经做了处理  一对一主键关联 默认cascade

       session.save(person);

 

One-to-one 双向主键

public class Husband {

    private int id;

    private String name;

    private Wife wife;

 

public class Wife {

    private int id ;

    private String name ;

    private Husband husband ;

 

    <class name="Husband" >

       <id name="id">

           <generator class="native">

           </generator>

       </id>

       <property name="name" />

    <one-to-one name="wife" ></one-to-one>

    </class>

 

    <class name="Wife" >

       <id name="id">

           <generator class="foreign">

           <param name="property">husband</param>

           </generator>

       </id>

       <property name="name" />

    <one-to-one name="husband" constrained="true"></one-to-one>

 

       Husband husband = (Husband)session.load(Husband.class, 1) ;

       System.out.println(husband.getWife().getName());

 

One-to-one 外键单向

public class IdCard {

    private int id ;

    private String cardNO ;

 

public class Person {

    private int id ;

    private String name ;

    private IdCard idCard ;

 

    <class name="IdCard" table="t_idCard">

       <id name="id">

           <generator class="native"/>

       </id>

       <property name="cardNO" />

    </class>

 

    <class name="Person" table="t_person">

       <id name="id">

           <generator class="native">

           </generator>

       </id>

       <property name="name" />

      <many-to-one name="idCard" unique="true"></many-to-one>

    </class>

 

       IdCard idCard = new IdCard() ;

       idCard.setCardNO("dddddddddddddddd") ;

       Person person = new Person() ;

       person.setIdCard(idCard) ;

       person.setName("张三丰") ;

       session.save(idCard) ;

       session.save(person);

 

one-to-one 双向外键

 

public class Husband {

    private int id;

    private String name;

    private Wife wife;

 

public class Wife {

    private int id ;

    private String name ;

    private Husband husband ;

 

 

    <class name="Wife" >

       <id name="id">

           <generator class="native">

           </generator>

       </id>

       <property name="name" />

    <one-to-one name="husband" property-ref="wife"></one-to-one>

    </class>

 

    <class name="Husband" >

       <id name="id">

           <generator class="native">

           </generator>

       </id>

       <property name="name" />

    <many-to-one name="wife" column="wifeid"></many-to-one>

    </class>

 

       Husband husband = (Husband) session.load(Husband.class, 2) ;

       System.out.println(husband.getWife().getName());

      

       Wife wife = (Wife) session.load(Wife.class, 2) ;

       System.out.println(wife.getHusband().getName());

 

One-to-many 单向

public class Classes {

    private int id;

    private String name;

    private Set<Student> students = new HashSet<Student>();

 

public class Student {

    private int id;

    private String name;

 

    <class name="Classes" >

       <id name="id">

           <generator class="native"/>

       </id>

       <property name="name" />

       <set name="students"  >

           <key column="classesid" ></key>

           <one-to-many class="Student"  />

       </set>

    </class>

 

    <class name="Student" >

       <id name="id">

           <generator class="native"/>

       </id>

       <property name="name" />

    </class>

 

       Classes classes = (Classes)session.load(Classes.class, 3) ;

       System.out.println(classes.getStudents().size());

 

One-to-many 双向

public class Classes {

    private int id;

    private String name;

    private Set<Student> students = new HashSet<Student>();

 

public class Student {

    private int id;

    private String name;

    private Classes classes;

 

    <class name="Classes" >

       <id name="id">

           <generator class="native"/>

       </id>

       <property name="name" />

       <set name="students" inverse="true"cascade="all" >

           <key column="classesid"></key>

           <one-to-many class="Student"  />

       </set>

    </class>

 

    <class name="Student" >

       <id name="id">

           <generator class="native"/>

       </id>

       <property name="name" />

       <many-to-one name="classes" column="classesid"/>

       <!-- 此处的column必须和Classes中配置的set中的key一致 -->

    </class>

 

       Classes classes = new Classes() ;

       classes.setName("classes-name") ;

      

       Student s1 = new Student() ;

       s1.setName("s1-name") ;

       s1.setClasses(classes) ;

      

       Student s2 = new Student() ;

       s2.setClasses(classes);

       s2.setName("s2-name") ;

      

       classes.getStudents().add(s1) ;

       classes.getStudents().add(s2) ;

      

       session.save(classes) ;

       // 此处通过配置inverse 属性 cascade 属性 

       // 只保存 classes   控制翻转之后 studeng自己保存 student发现没有classes

       // 于是通过级联 先保存classes  在进行student保存

      

   

 

Many-to-many 单向

public class Role {

    private int id;

    private String name;

 

public class User {

    private int id;

    private String name;

    private Set<Role> roles = new HashSet<Role>();

 

    <class name="Role" table="t_role">

       <id name="id">

           <generator class="native"/>

       </id>

       <property name="name" />

    </class>

 

 

    <class name="User" table="t_user">

       <id name="id">

           <generator class="native"/>

       </id>

       <property name="name" />

       <!-- 配置第三张表的关联id -->

       <set name="roles">

           <key column="userid" />

           <many-to-many column="roleid" class="Role"/>

       </set>

    </class>

 

    User user = new User() ;

       user.setName("user-name") ;

       Role role1 = new Role() ;

       role1.setName("role1-name") ;

       Role role2 = new Role() ;

       role2.setName("role2-name") ;

       user.getRoles().add(role1) ;

       user.getRoles().add(role2) ;

       session.save(role1) ;

       session.save(role2) ;

       session.save(user);

 

    User user = (User) session.load(User.class, 2) ;

       System.out.println(user.getRoles().size());

      

Many-to-many 双向

public class Role {

    private int id;

    private String name;

    private Set<User> users= new HashSet<User>() ;

 

public class User {

    private int id;

    private String name;

    private Set<Role> roles = new HashSet<Role>();

 

    <class name="Role" table="t_role">

       <id name="id">

           <generator class="native"/>

       </id>

       <property name="name" />

       <set name="users" table="t_user_role">

       <key column="roleid"></key>

       <many-to-many column="userid" class="User"></many-to-many>

       </set>

    </class>

 

    <class name="User" table="t_user">

       <id name="id">

           <generator class="native"/>

       </id>

       <property name="name" />

       <!-- 配置第三张表的关联id -->

       <set name="roles" table="t_user_role">

           <key column="userid" />

           <many-to-many column="roleid" class="Role"/>

       </set>

    </class>

 

    Role role = (Role) session.load(Role.class, 2) ;

       System.out.println(role);

       for(User u:role.getUsers())

           System.out.println(u.getName());

 

 

关于继承:

1】  多个继承类保存在一张表中

 

 

public class Animal {

 

    private int id;

    private String name;

    private boolean sex;

 

public class Bird extends Animal {

    private int height;

 

public class Pig extends Animal {

    private int weight;

 

    <class name="Animal" table="t_animal">

       <id name="id">

           <generator class="native">

           </generator>

       </id>

       <!-- 在数据库里面加一个字段 区分不同的类 -->

       <discriminator column="type" type="string"/>

       <property name="name" />

       <property name="sex" />

       <subclass name="Pig" discriminator-value="P">

           <property name="weight" />

       </subclass>

       <subclass name="Bird" discriminator-value="B">

           <property name="height" />

       </subclass>

    </class>

 

2】  每个继承类分别保存 在不同的表中,其中父表保存公共属性,子表分别保存其特有属性

 

public class Animal {

 

    private int id;

    private String name;

private boolean sex;

 

public class Bird extends Animal {

private int height;

 

public class Pig extends Animal {

private int weight;

 

    <class name="Animal">

       <id name="id">

           <generator class="native">

           </generator>

       </id>

       <property name="name" />

       <property name="sex" />

       <joined-subclass name="Pig">

           <key column="pigid" />

           <property name="weight" />

       </joined-subclass>

       <joined-subclass name="Bird">

           <key column="birdid" />

           <property name="height" />

       </joined-subclass>

</class>

 

       Bird bird = (Bird) session.load(Bird.class,3) ;

    System.out.println(bird.getName());

 

3】 父类不形成表,每个子类分别保存在不同的表中

 

public abstract class Animal {

    private int id;

    private String name;

private boolean sex;

 

public class Bird extends Animal {

private int height;

 

public class Pig extends Animal {

private int weight;

 

    <class name="Animal" abstract="true">

       <id name="id">

           <generator class="assigned">

           </generator>

       </id>

       <property name="name" />

       <property name="sex" />

       <union-subclass name="Pig">

           <property name="weight" />

       </union-subclass>

       <union-subclass name="Bird">

           <property name="height" />

       </union-subclass>

</class>

 

Pig pig = new Pig() ;

       pig.setName("pig-name") ;

       pig.setSex(false) ;

       pig.setWeight(100) ;

       pig.setId(1) ;

      

       session.save(pig) ;

      

       Bird bird = new Bird() ;

       bird.setHeight(10) ;

       bird.setName("bird-name") ;

       bird.setSex(true) ;

       bird.setId(2) ;

      

    session.save(bird);

 

 

组件映射

public class User {

    private int id;

    private String name;

private Contact contact;

 

public class Contact {

    private String zipCode;

    private String address;

    private String contactTel;

private String phoneNumber;

 

    <class name="User" table="t_user">

       <id name="id">

           <generator class="native" />

       </id>

       <property name="name" />

       <component name="contact">

           <property name="zipCode" />

           <property name="address" />

           <property name="contactTel" />

           <property name="phoneNumber" />

      </component>

</class>

复合主键映射

public class StudentPK implements Serializable{

    private String college;

private String studentID;

// 需要重写hashcode 方法 equals方法

 

public class Student {

    private String name;

    private String sex;

    private int age;

    private StudentPK pk;

 

    <class name="Student" >

       <composite-id name="pk">

           <key-property name="college" />

           <key-property name="studentID" />

       </composite-id>

       <property name="name" />

       <property name="sex" />

       <property name="age" />

      

    </class>

 

User user = new User() ;

      

       Contact contact = new Contact();

       contact.setAddress("XXXXXXXXXXX") ;

       contact.setContactTel("123311111111111") ;

       contact.setPhoneNumber("121111111111111") ;

       contact.setZipCode("123131") ;

      

       user.setName("shanyuxiyun") ;

       user.setContact(contact) ;

       session.save(user);

 

其他集合映射

public class CollectionMapping {

    private int id;

    private String name;

    private List<String>list = new ArrayList<String>();

    private String[] array = new String[10];

    private Map<String,String> map = new HashMap<String, String>();

    private Set<String> set = new HashSet<String>();

 

    <class name="CollectionMapping">

       <id name="id">

           <generator class="native">

           </generator>

       </id>

       <property name="name" />

       <list name="list">

           <key column="list_id" />

           <list-index column="list_index" />

           <element column="list_value" type="string" />

       </list>

       <array name="array">

           <key column="array_id"/>

           <list-index column="array_index"/>

           <element column="array_value" type="string"/>

       </array>

       <map name="map">

           <key column="map_id"/>

           <map-key column="map_key" type="string"/>

           <element column="map_value" type="string"/>

       </map>

       <set name="set">

           <key column="set_id"/>

           <element column="set_value" type="string"/>

       </set>

      

    </class>

 

    CollectionMapping cm = new CollectionMapping();

       cm.setArray(new String[] { "aa", "bb", "cc" });

       Set<String> set = new HashSet<String>();

       set.add("set1");

       set.add("set2");

       set.add("set3");

       cm.setSet(set);

       Map<String, String> map = new HashMap<String, String>();

       map.put("k1", "v1");

       map.put("k2", "v2");

       map.put("k3", "v3");

       cm.setMap(map);

       List<String> list = new ArrayList<String>();

       list.add("list1");

       list.add("list2");

       list.add("list3");

       cm.setList(list);

       cm.setName("name");

 

       session.save(cm);

悲观锁

    <class name="Inventory" >

       <id name="itemNO">

           <generator class="native"/>

       </id>

       <property name="name" />

       <property name="quatity"/>

    </class>

 

  Inventory inventory = (Inventory) session.load(Inventory.class, 1,   LockMode.UPGRADE) ;

       System.out.println(inventory.getQuatity());

       inventory.setQuatity(inventory.getQuatity()-200) ;

        session.flush() ;

 

乐观锁

public class Inventory {

    private int itemNO;

    private String name;

    private int quatity;

    private int version;

 

 

    <class name="Inventory" optimistic-lock="version">

       <id name="itemNO">

           <generator class="native"/>

       </id>

       <property name="version" />

       <property name="name" />

       <property name="quatity"/>

    </class>

 

  Inventory inventory = (Inventory)session.load(Inventory.class, 1) ;

       System.out.println(inventory.getQuatity());

       inventory.setQuatity(inventory.getQuatity()-200) ;

       session.flush() ;