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();
}
一對多
以昨天的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);
結果
多對多
多對多的關系會産生一張中間表,我們用學生和老師為例,用
@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();
}
結果
一對一
一對一映射分為兩種,在任意一方添加外鍵的外鍵映射,還有直接通過一方的主鍵映射。
-
外鍵映射
以公民和身份證為例:
@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();
}
結果
- 主鍵映射
@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();
}
結果