一、 jpa映射单个对象
1.右键项目,选择myeclipse,添加Jpa支持
2.添加之后,在src下面会生成一个META-INF 文件夹
编写里面的persistence.xml文件
创建相应的数据库
<persistence-unitname="jpaPU"transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<propertyname="hibernate.dialect"value="org.hibernate.dialect.MySQLDialect"/>
<propertyname="hibernate.connection.driver_class"value="com.mysql.jdbc.Driver"/>
<propertyname="hibernate.connection.url"value="jdbc:mysql:///db_39"/>
<propertyname="hibernate.connection.username"value="root"/>
<propertyname="hibernate.connection.password"value="eminem"/>
<propertyname="hibernate.hbm2ddl.auto"value="create"/>
<propertyname="hibernate.show_sql"value="true"/>
</properties>
</persistence-unit>
3.实体User里面
/*
* @Entity 告诉数据库是放在数据库里面
* @Table 对应的是什么表。也可以不写,不写的话就是和类命一样
* @Id 说明是主键
* @GeneratedValue() 括号里面不写值会自动选择一个主键策略相当于hibernate里面的native
* strategy=GenerationType. 点出对应的策略
* @Column() 里面的值有 nullable=true 是否为空
* name="" 对应的数据库里面的列名
* unique=true 唯一
*/
@Entity
@Table(name="user")
publicclass User {
@Id
@GeneratedValue()
privateintid;
private Stringname;
private Datebirthday;
publicint getId() {
returnid;
}
publicvoid setId(int id) {
this.id = id;
}
public String getName() {
returnname;
}
publicvoid setName(String name) {
this.name = name;
}
public Date getBirthday() {
returnbirthday;
}
publicvoid setBirthday(Date birthday) {
this.birthday = birthday;
}
}
4.工具类里面JpaUtil
publicfinalclass JpaUtil {
privatestatic EntityManagerFactoryemf;
static {
//jpaPU 对应的是persistence.xml里面的persistence-unit的name的值
emf =Persistence.createEntityManagerFactory("jpaPU");
}
publicstatic EntityManager getEntityManager(){
returnemf.createEntityManager();
}
}
5.测试,添加数据,编写测试类JpaTest
publicclassJpaTest{
publicstaticvoid main(String[] args) {
User user = new User();
user.setBirthday(new Date());
user.setName("james");
addUser(user);
}
static void addUser(User user){
EntityManager em = null;
EntityTransaction tx = null;
try{
em = JpaUtil.getEntityManager();
tx = em.getTransaction();
tx.begin();
em.persist(user);
tx.commit();
}finally{
if(em!=null){
em.close();
}
}
}
}
二、 jpa映射关联与继承
1.多这一方Employee(父类)
/*
* SINGLE_TABLE,一张表映射一颗继承树 确定采用单表策略
* @DiscriminatorColumn 配置鉴别器。鉴别器的名称为type
* @DiscriminatorValue 设置鉴别器的值
*/
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="type")
@DiscriminatorValue("0")
publicclass Employee {
@Id
@GeneratedValue
privateintid;
private Stringname;
@ManyToOne()
private Departmentdepart;
省略相关setget方法
}
2.子类 Skiller
@Entity
@DiscriminatorValue("1")
publicclass SkillerextendsEmployee{
private Stringskill;
public String getSkill(){
returnskill;
}
publicvoid setSkill(String skill){
this.skill = skill;
}
}
3.一这一方 Department
@Entity
publicclass Department {
@Id
@GeneratedValue
privateintid;
private Stringname;
/*
* targetEntity 目标实体是什么
* cascade 级联
* CascadeType 你需要什么方法级联,就选择
* fetch 抓取策略 FetchType.LAZY 延迟加载
* mappedBy 值对应的是Employee里面的Department属性名
*/
@OneToMany(targetEntity = Employee.class, cascade = { CascadeType.MERGE,
CascadeType.PERSIST }, fetch = FetchType.LAZY, mappedBy = "depart")
privateSet<Employee>emps;
对应的setget方法省略
}
4.添加方法至 JpaTest 修改main
staticvoid addDepart(){
EntityManager em = null;
try{
em = JpaUtil.getEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Department depart = new Department();
depart.setName("技术部");
Skiller emp1 = new Skiller();
emp1.setDepart(depart);
emp1.setName("张三");
emp1.setSkill("c");
Employee emp2 = new Employee();
emp2.setDepart(depart);
emp2.setName("李四");
Set<Employee> emps = new HashSet<Employee>();
emps.add(emp2);
emps.add(emp1);
depart.setEmps(emps);
em.persist(depart);
tx.commit();
}finally{
if(em!=null){
em.close();
}
}
}
publicstaticvoid main(String[] args) {
addDepart();
}
Department表里面的数据
1 技术部
Employee表里面的数据
1 1 张三 c 1
0 2 李四 null 1