Hibernate 1-N单向关联(注解实现)

无连接表的1-N单向关联


Person.java(1端)

package com.oneToMany;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name="person_inf")
public class Person {

    @Id
    @Column(name="person_id")//name="person_id"
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;
    private String name;
    private int age;
    @OneToMany(targetEntity=Address.class)
    //映射外键列,此处映射的外键列会添加到关联实体对应的数据库中
    @JoinColumn(name="fk_person_id" ,referencedColumnName="person_id")//name="fk_person_id" ,referencedColumnName="person_id"
    //N的一端以集合set形式出现
    private Set<Address> address=new HashSet<Address>();
    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 int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Set<Address> getAddress() {
        return address;
    }
    public void setAddress(Set<Address> address) {
        this.address = address;
    }



}

Address.java(N端)

package com.oneToMany;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="address_inf")//catalog="hibernate_oneToMany",name="address_inf"
public class Address {

    @Id
    @Column(name="address_id")//name="address_id"
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;
    private String addressDetail;
    public Address(){}
    public Address(String addressDetail ){
        this.addressDetail=addressDetail;
                }
    public void setId(Integer id) {
        this.id = id;
    }
    public Integer getId() {
        return id;
    }
    public void setAddressDetail(String addressDetail) {
        this.addressDetail = addressDetail;
    }
    public String getAddressDetail() {
        return addressDetail;
    }

}

TestDemo.java

public static void test2() {

        StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
                .configure("hibernate.cfg.xml").build();
        SessionFactory factory = new MetadataSources(registry).buildMetadata()
                .buildSessionFactory();
        // 获取Session
        Session session = factory.openSession();
        Transaction transaction = session.beginTransaction();
        try {

            Person person = new Person();
            // 持久化Person对象
            session.save(person);
            Address address = new Address("GDUT");
            person.setName("Jeff");
            person.setAge(21);
            // 持久化Address对象
            session.persist(address);
            // 添加地址1
            person.getAddress().add(address);

            Address address2 = new Address("SCGT");
            // 添加地址2
            person.getAddress().add(address2);
            // 持久化Address对象
            session.persist(address2);

            transaction.commit();

        } catch (Exception e) {
            transaction.rollback();// 回滚事务
            e.getMessage();
        } finally {
            if (session != null) {
                session.close();
            }
        }
    }
```![效果图片](http://img.blog.csdn.net/20160901225532760)

----------
**有连接表的1-N单向关联**


----------
Person.java





<div class="se-preview-section-delimiter"></div>

package com.oneToMany;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name=”person_inf”)
public class Person {

@Id
@Column(name="person_id")//name="person_id"
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String name;
private int age;
@OneToMany(targetEntity=Address.class)
/*
 * @JoinTable(name="person_address",
 * //定义连接表中名为fk_person_id的外键列,该外键列参照当前实体对应的主键列
 * joinColumns=@JoinColumn(name="fk_person_id"
 * ,referencedColumnName="person_id"),
 * //定义连接表中名为fk_address_id的外键列,该外键列参照当前实体关联实体对应的主键列
 * inverseJoinColumns=@JoinColumn
 * (name="fk_address_id",referencedColumnName="address_id", unique=true))
 *
 * @JoinTable注解映射fk_address_id外键列,添加了唯一约束,说明一个Address实体至多只能关联一个
 * Person实体,而一个Person实体可以关联多个Address实体
 * 
 */

@JoinTable(name="person_address",
        //定义连接表中名为fk_person_id的外键列,该外键列参照当前实体对应的主键列
joinColumns=@JoinColumn(name="fk_person_id",referencedColumnName="person_id"),
        //定义连接表中名为fk_address_id的外键列,该外键列参照当前实体关联实体对应的主键列
inverseJoinColumns=@JoinColumn(name="fk_address_id",referencedColumnName="address_id",
unique=true))
//N的一端以集合set形式出现
private Set<Address> address=new HashSet<Address>();
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 int getAge() {
    return age;
}
public void setAge(int age) {
    this.age = age;
}
public Set<Address> getAddress() {
    return address;
}
public void setAddress(Set<Address> address) {
    this.address = address;
}

}

Address.java





<div class="se-preview-section-delimiter"></div>

package com.oneToMany;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name=”address_inf”)//catalog=”hibernate_oneToMany”,name=”address_inf”
public class Address {

@Id
@Column(name="address_id")//name="address_id"
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String addressDetail;
public Address(){}
public Address(String addressDetail ){
    this.addressDetail=addressDetail;
            }
public void setId(Integer id) {
    this.id = id;
}
public Integer getId() {
    return id;
}
public void setAddressDetail(String addressDetail) {
    this.addressDetail = addressDetail;
}
public String getAddressDetail() {
    return addressDetail;
}

}

TestDemo.java





<div class="se-preview-section-delimiter"></div>

public static void test2() {

    StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
            .configure("hibernate.cfg.xml").build();
    SessionFactory factory = new MetadataSources(registry).buildMetadata()
            .buildSessionFactory();
    // 获取Session
    Session session = factory.openSession();
    Transaction transaction = session.beginTransaction();
    try {

        Person person = new Person();
        // 持久化Person对象
        session.save(person);
        Address address = new Address("GDUT");
        person.setName("Jeff");
        person.setAge(21);
        // 持久化Address对象
        session.persist(address);
        // 添加地址1
        person.getAddress().add(address);

        Address address2 = new Address("SCGT");
        // 添加地址2
        person.getAddress().add(address2);
        // 持久化Address对象
        session.persist(address2);

        transaction.commit();

    } catch (Exception e) {
        transaction.rollback();// 回滚事务
        e.getMessage();
    } finally {
        if (session != null) {
            session.close();
        }
    }
}

“`

效果图

通过上面两个例子,我们可以知道,对于采用连接表的单向1-N关联,由于采用连接表维护了关联关系,两个对应的数据表无需增加外键列,所以两个实体对应的数据表就没有主从表关系。程序可以想先持久化哪个实体就先持久化哪个实体,不会引发性能问题。

public static void test2() {

        StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
                .configure("hibernate.cfg.xml").build();
        SessionFactory factory = new MetadataSources(registry).buildMetadata()
                .buildSessionFactory();
        // 获取Session
        Session session = factory.openSession();
        Transaction transaction = session.beginTransaction();
        try {

            Person person = new Person();
            // 持久化Person对象
            session.save(person);
            Address address = new Address("GDUT");
            person.setName("Jeff");
            person.setAge(21);
            // 持久化Address对象
            session.persist(address);
            // 添加地址1
            person.getAddress().add(address);

            Address address2 = new Address("SCGT");
            // 添加地址2
            person.getAddress().add(address2);
            // 持久化Address对象
            session.persist(address2);

            transaction.commit();

        } catch (Exception e) {
            transaction.rollback();// 回滚事务
            e.getMessage();
        } finally {
            if (session != null) {
                session.close();
            }
        }
    }

通过图片知道,我们可以知道,对于采用连接表的单向1-N关联,由于采用连接表维护了关联关系,两个对应的数据表无需增加外键列,所以两个实体对应的数据表就没有主从表关系。程序可以想先持久化哪个实体就先持久化哪个实体,不会引发性能问题。对于没有连接表的关联来说,要想优化性能,在持久化Address类之前,我们需要给Address实体指定关联的实体,就是person.getAddress().add(address)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值