天天看點

Hibernate注解開發

Hibernate注解開發通過實作JPA(Java Persistence API)規範,使用注解和配置檔案進行開發。

PO類注解配置

@Entity

定義實體類,

@Table

描述表與實體類的關系,

@Id

聲明主鍵,

@GeneratedValue(strategy=GenerationType.)

用于設定主鍵生成政策,如果要使用uuid等Hibernate架構的主鍵生成政策,要先使用

@GeneraticGenerator(name="myuuid",strategy="uuid")

,再

@GeneratedValue(generator="myuuid")

,預設相當于native。

@Column

用來定義列,

@Temporoal

用來聲明日期,最後要在hibernate.cfg.xml中配置PO的映射。例子:

@Entity//定義實體類
@Table(name="t_book",catalog="hibernatetest")
public class Book {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;
    @Column(name="name",length=,nullable=true) 
    private String name;
    @Temporal(TemporalType.TIMESTAMP)
    private Date publicationDate;
//  @Type(type="double")
    private Double price;
           
@Entity
@Table(name="t_person",catalog="hibernateTest")
public class Person {

    @Id
    @GenericGenerator(name="myuuid",strategy="uuid")
    @GeneratedValue(generator="myuuid")
    private String id;
    @Type(type="string")
    private String name;
    @Transient
    private Date birthday ;
           
<mapping  class="domain.annocation.Book"/>
        <mapping  class="domain.annocation.Person"/>
           

test

@Test
    public void test1(){
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        Book book = new Book();
        book.setName("挪威的森林");
        book.setPrice(d);
        book.setPublicationDate(new Date());
        Person person = new  Person();
        person.setName("直子");
        person.setBirthday(new Date());
        session.save(book);
        session.save(person);
        session.getTransaction().commit();
        session.close();

    }
           
Hibernate注解開發

一對多

以昨天的Customer和Order為例,

@Entity
@Table(name="t_customer",catalog="hibernatetest")
public class Customer {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;
    private String name;
    @OneToMany(targetEntity=Order.class,mappedBy="c",cascade=CascadeType.ALL,orphanRemoval=true)
    private Set<Order> orders = new HashSet<>();
           
@Entity
@Table(name="t_order",catalog="hibernatetest")
public class Order {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;
    private Double money;
    private String receiveInfo;
    @ManyToOne(targetEntity=Customer.class)
    @JoinColumn(name="customer_id")
    private Customer c;
           
Customer c = new Customer();
        c.setName("綠子");
        Order o1 = new Order();
        Order o2 = new Order();
        o1.setMoney(d);
        o2.setMoney(d);
        o1.setReceiveInfo("東京");
        o2.setReceiveInfo("大阪");
        o1.setC(c);
        o2.setC(c);
        c.getOrders().add(o1);
        c.getOrders().add(o2);
        session.save(c);
           

結果

Hibernate注解開發

多對多

多對多的關系會産生一張中間表,我們用學生和老師為例,用

@ManyToMany

來配置多對多,隻需要在一端配置中間表,另一端設定mappedBy來表示對外鍵的維護權。

@Entity
@Table(name="t_teac",catalog="hibernatetest")
public class Teacher {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;
    private String name;
    @ManyToMany(targetEntity=Student.class,mappedBy="teachers")
    private Set<Student> students = new HashSet<>();
           
@Entity
@Table(name="t_stu",catalog="hibernatetest")
public class Student {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;
    private String  name;
    @ManyToMany(targetEntity=Teacher.class)
    @JoinTable(name="s_t",joinColumns={@JoinColumn(name="student_id")},
                inverseJoinColumns={@JoinColumn(name="teacher_id")})
    @Cascade(CascadeType.ALL)//在Student中配置級聯
    private Set<Teacher> teachers = new HashSet<>();
           

注意這裡的Cascade和CascadeType都應該是org.hibernate.annotations包下的。

Test

@Test
    public void test3(){
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        Teacher t1 = new Teacher();
        Teacher t2 = new Teacher();
        t1.setName("teacher1");
        t2.setName("teacher2");
        Student s1 = new Student();
        Student s2 = new Student();
        s1.setName("student1");
        s2.setName("student2");
        s1.getTeachers().add(t1);
        s1.getTeachers().add(t2);
        s2.getTeachers().add(t1);
        s2.getTeachers().add(t2);       
        session.save(s1);
        session.save(s2);
        session.getTransaction().commit();
        session.close();
    }
           

結果

Hibernate注解開發

一對一

一對一映射分為兩種,在任意一方添加外鍵的外鍵映射,還有直接通過一方的主鍵映射。

  • 外鍵映射

    以公民和身份證為例:

@Entity
@Table(name="t_idcard",catalog="hibernatetest")
public class IDCard {
    @Id
    @GenericGenerator(name="i_uuid",strategy="uuid")
    @GeneratedValue(generator="i_uuid")
    private String id;
    private String cardNum;
    @OneToOne(targetEntity=Citizen.class)
    @JoinColumn(name="citizen_id")
    @Cascade(CascadeType.SAVE_UPDATE)
           
@Entity
@Table(name="t_citizen",catalog="hibernatetest")
public class Citizen {
    @Id
    @GenericGenerator(name="c_uuid",strategy="uuid")
    @GeneratedValue(generator="c_uuid")
    private String id;
    private String name;
    @OneToOne(targetEntity=IDCard.class,mappedBy="citizen")
    private IDCard idcard;
           
@Test
    public void test4(){
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        Citizen citizen = new Citizen();
        citizen.setName("渡邊");
        IDCard idcard = new IDCard();
        idcard.setCardNum("123321123212321123");
        idcard.setCitizen(citizen);
        session.save(idcard);
        session.getTransaction().commit();
        session.close();
    }
           

結果

Hibernate注解開發
  • 主鍵映射
@Id
    @GenericGenerator(name="i_uuid",strategy="uuid")
    @GeneratedValue(generator="i_uuid")
    private String id;
    private String cardNum;
    @OneToOne(targetEntity=Citizen.class)
    @JoinColumn(name="citizen_id")
    @PrimaryKeyJoinColumn
    @Cascade(CascadeType.SAVE_UPDATE)
           
@Id
    @GenericGenerator(name="myForeign",strategy="foreign",
    parameters={@Parameter(name="property",value="idcard")})
    @GeneratedValue(generator="myForeign")
    private String id;
    private String name;
    @OneToOne(targetEntity=IDCard.class,mappedBy="citizen")
    @PrimaryKeyJoinColumn
    private IDCard idcard;
           
@Test
    public void test5(){
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        Citizen citizen = new Citizen();
        citizen.setName("渡邊");
        IDCard idcard = new IDCard();
        idcard.setCardNum("123321123212321123");
        idcard.setCitizen(citizen);
        citizen.setIdcard(idcard);//這裡要做雙向關聯
        session.save(idcard);
        session.getTransaction().commit();
        session.close();
    }
           

結果

Hibernate注解開發

繼續閱讀