zoukankan      html  css  js  c++  java
  • jpa一对一映射案例

     双向和单向的区别,其实不在数据库,而在加载方向。如Person和IdCard,单向是Person拥有IdCard的实例可以加载IdCard,而双向不但Person可以加载IdCard,IdCard可以拥有Person实例来加载Person。数据库还是原来的数据库(两个共享主键的表)

    以下模拟双向一对一得映射案例

    表结构如下:

    Person表结构

    IdCard表结构

     

    IDCard类

    package com.ljq.entity;

    import javax.persistence.CascadeType;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.OneToOne;
    import javax.persistence.Table;
    /**
    * 身份证
    *
    *
    @author jiqinlin
    *
    */
    @Entity
    @Table(name
    = "tb_idcard")
    public class IDCard {
    @Id
    @GeneratedValue
    private Integer id;

    @Column(nullable
    = false, length = 18)
    private String cardno;

    //unique= true 指明personid列的值不可重复。
    //optional = false指明Person不可为空
    @OneToOne(cascade = CascadeType.ALL, optional = false)
    @JoinColumn(name
    = "personid",referencedColumnName="id", unique = true)
    private Person person;

    public IDCard() {
    super();
    }

    public IDCard(String cardno) {
    super();
    this.cardno = cardno;
    }


    public String getCardno() {
    return cardno;
    }

    public void setCardno(String cardno) {
    this.cardno = cardno;
    }


    public Integer getId() {
    return id;
    }

    public void setId(Integer id) {
    this.id = id;
    }


    public Person getPerson() {
    return person;
    }

    public void setPerson(Person person) {
    this.person = person;
    }

    }

    Person类

    package com.ljq.entity;

    import javax.persistence.CascadeType;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.OneToOne;
    import javax.persistence.Table;

    /**
    * 人
    *
    *
    @author jiqinlin
    *
    */
    @Entity
    @Table(name
    = "tb_person")
    public class Person {
    @Id
    @GeneratedValue
    private Integer id;

    @Column(nullable
    = false, length = 20)
    private String name;

    //optional = false指明IDCard可为空
    //mappedBy="person"指明Person作为双向关系的维护段,负责外键的更新,起主导作用
    @OneToOne(optional = true, cascade = CascadeType.ALL, mappedBy="person")
    private IDCard idcard;

    public Person() {
    super();
    }

    public Person(String name) {
    super();
    this.name = name;
    }

    public Integer getId() {
    return id;
    }

    public void setId(Integer id) {
    this.id = id;
    }

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }

    public IDCard getIdcard() {
    return idcard;
    }

    public void setIdcard(IDCard idcard) {
    this.idcard = idcard;
    }

    }

    OneToOneTest测试类

    package com.ljq.test;

    import java.util.List;

    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.Persistence;

    import org.junit.Test;

    import com.ljq.entity.IDCard;
    import com.ljq.entity.Person;

    public class OneToOneTest {

    /**
    * 添加人的时候同时添加对应的身份证
    */
    @Test
    public void save() {
    EntityManagerFactory factory
    = Persistence.createEntityManagerFactory("ljq");
    EntityManager em
    = factory.createEntityManager();
    em.getTransaction().begin();

    Person person
    = new Person();
    person.setName(
    "lisi");
    IDCard idcard
    =new IDCard();
    idcard.setCardno(
    "350524");
    idcard.setPerson(person);
    person.setIdcard(idcard);

    em.persist(person);

    em.getTransaction().commit();
    em.close();
    factory.close();
    }

    /**
    * 删除
    */
    @Test
    public void delete() {
    EntityManagerFactory factory
    = Persistence.createEntityManagerFactory("ljq");
    EntityManager em
    = factory.createEntityManager();
    em.getTransaction().begin();

    //删除人同时会自动删除身份证
    em.remove(em.getReference(Person.class, 2));

    //删除身份证同时删除人
    //em.remove(em.getReference(IDCard.class, (Serializable)1));

    em.getTransaction().commit();
    em.close();
    factory.close();
    }

    /**
    * 更新
    */
    @SuppressWarnings(
    "unchecked")
    @Test
    public void update() {
    EntityManagerFactory factory
    = Persistence.createEntityManagerFactory("ljq");
    EntityManager em
    = factory.createEntityManager();
    em.getTransaction().begin();

    List
    <Person> persons=em.createQuery("select o from Person o").getResultList();
    for(Person person:persons){
    person.setName(
    "wangwu");
    IDCard idcard
    =person.getIdcard();
    if(idcard!=null){
    idcard.setCardno(
    "abc");
    }
    em.merge(person);
    }

    em.getTransaction().commit();
    em.close();
    factory.close();
    }

    /**
    * 用来判断映射是否成功
    *
    */
    @Test
    public void test() {
    Persistence.createEntityManagerFactory(
    "ljq");
    }

    }
  • 相关阅读:
    设计模式的概念与作用
    动画回调函数未执行
    使用PathfindingProject Pro 4.0.10实现2D自动寻路
    一些概念和路径记录
    android 数据库添加字符串 添加失败 解决方案
    view的focusable属性改变设置是否可获取光标
    view的clickable属性和点击background颜色改变
    java中一对多 关联建表
    Android 自定义View
    Android 之常用布局
  • 原文地址:https://www.cnblogs.com/linjiqin/p/1978496.html
Copyright © 2011-2022 走看看