>  기사  >  Java  >  java Hibernate 다대다 매핑 자세한 설명 및 예제 코드

java Hibernate 다대다 매핑 자세한 설명 및 예제 코드

高洛峰
高洛峰원래의
2017-01-23 11:43:341074검색

java Hibernate 다대다 매핑

머리말:

1 단방향 다대다

단방향 다의 예 -다다 사용 인력 및 직위 예를 들어, 한 사람이 여러 직위를 가질 수 있고 한 직위에 여러 사람이 있을 수 있습니다. 단방향 다대다란 한쪽 끝에서만 다른 쪽 끝의 콘텐츠를 쿼리하고 얻을 수 있음을 의미합니다. 다대다 관계는 관계 모델을 생성할 때 객체보다 먼저 연관 테이블을 생성합니다. 연관 테이블은 두 관계 테이블의 기본 키를 저장합니다.

java Hibernate多对多映射详解及实例代码

java Hibernate多对多映射详解及实例代码

코드 부분 :

(1) 매핑 및 관계 클래스

단방향 관계이므로 다음만 필요합니다. 한 쪽 끝에 유지되므로 User.hbm.xml 구성 파일에 f28ba8748e989755003e512f5a4f884c 태그를 추가하고, 해당 열 관계를 태그에 추가하고, ace372f96ca3ec664acb3aaa2421b04c ; 새로운 테이블 생성을 나타내는 테이블, User. 관계를 유지하기 위해 별도의 태그를 추가할 필요가 없습니다.

<span style="font-family:KaiTi_GB2312;font-size:18px;"><hibernate-mapping>
  <class name="com.bjpowernode.hibernate.User" table="t_user">
    <id name="id">
      <generator class="native"/>
    </id>
    <property name="name"/>
    <set name="roles" table="t_user_role">
      <key column="user_id"/>
      <many-to-many class="com.bjpowernode.hibernate.Role" column="role_id" /> 
    </set>
  </class>
</hibernate-mapping></span>

사용자 매핑에는 세트 매핑이 있으므로 해당하는 태그에 Hashset을 추가해야 합니다. class 파일의 User.java 코드는 다음과 같습니다.

<hibernate-mapping>
  <class name="com.bjpowernode.hibernate.Role" table="t_role">
    <id name="id">
      <generator class="native"/>
    </id>
    <property name="name"/>
  </class>
</hibernate-mapping>

Role.java 코드는

<span style="font-family:KaiTi_GB2312;font-size:18px;">import java.util.Set;
  
public class User {
    
  private int id;
    
  private String name;
  
  private Set roles;
    
  public int getId() {
    return id;
  }
  
  public void setId(int id) {
    this.id = id;
  }
  
  public String getName() {
    return name;
  }
  
  public void setName(String name) {
    this.name = name;
  }
  
  public Set getRoles() {
    return roles;
  }
  
  public void setRoles(Set roles) {
    this.roles = roles;
  }
}</span>

(2) 데이터 추가 및 읽기: 추가하려면

데이터가 생성되면 먼저 관계를 데이터베이스에 저장한 다음 사용자 해시 테이블을 생성하고 해당 테이블을 추가해야 합니다. 해시 테이블과의 관계를 확인하고 마지막으로 사용자를 생성하고 해당 사용자에게 해시 테이블을 추가합니다. 이 부분에서 주의해야 할 점은 작성 순서입니다. 그렇지 않으면 이전 매핑과 마찬가지로 null 값이 많이 발생하게 됩니다.

public class Role {
  
  private int id;
    
  private String name;
    
  public int getId() {
    return id;
  }
  
  public void setId(int id) {
    this.id = id;
  }
  
  public String getName() {
    return name;
  }
  
  public void setName(String name) {
    this.name = name;
  }
}

읽을 때는 일방적인 관계이기 때문에 한쪽을 통해서 상대방의 내용만 읽고, 사용자 콘텐츠를 통한 역할. 코드는 다음과 같습니다.

public void testSave1() {
    Session session = null;
    try {
      session = HibernateUtils.getSession();
      session.beginTransaction();
        
      Role r1 = new Role();
      r1.setName("数据录入人员");
      session.save(r1);
        
      Role r2 = new Role();
      r2.setName("商务主管");
      session.save(r2);
        
      Role r3 = new Role();
      r3.setName("商务经理");
      session.save(r3);
        
      Role r4 = new Role();
      r4.setName("项目会计");
      session.save(r4);
        
      User u1 = new User();
      u1.setName("张三");
      Set u1Roles = new HashSet();
      u1Roles.add(r1);
      u1Roles.add(r2);
      u1.setRoles(u1Roles);
      session.save(u1);
        
      User u2 = new User();
      u2.setName("李四");
      Set u2Roles = new HashSet();
      u2Roles.add(r1);
      u2Roles.add(r2);
      u2Roles.add(r3);
      u2.setRoles(u2Roles);
      session.save(u2);
        
      User u3 = new User();
      u3.setName("王五");
      Set u3Roles = new HashSet();
      u3Roles.add(r3);
      u3Roles.add(r4);
      u3.setRoles(u3Roles);
      session.save(u3);
        
      session.getTransaction().commit();
    }catch(Exception e) {
      e.printStackTrace();
      session.getTransaction().rollback();
    }finally {
      HibernateUtils.closeSession(session);
    }
  }

2. 양방향 다대다 매핑

앞서 소개했듯이 양방향 다대다 매핑은 양쪽 끝에서 관계를 유지합니다. 동시에 양쪽 끝에서 콘텐츠를 로드할 수 있습니다. 더 이상 고민할 필요 없이 바로 코드로 넘어가겠습니다.

양방향이므로 동시에 양방향 컬렉션 매핑을 추가해야 합니다. 여러 쌍을 추가하려면 구성 파일에 ace372f96ca3ec664acb3aaa2421b04c 태그를 추가하세요. 여러 태그의 경우 Role.hbm.xml 코드는 다음과 같습니다.

public void testLoad1() {
    Session session = null;
    try {
      session = HibernateUtils.getSession();
      session.beginTransaction();
      User user = (User)session.load(User.class, 2);
      System.out.println(user.getName());
      for (Iterator iter=user.getRoles().iterator(); iter.hasNext();) {
        Role role = (Role)iter.next();
        System.out.println(role.getName());
      }
      session.getTransaction().commit();
    }catch(Exception e) {
      e.printStackTrace();
      session.getTransaction().rollback();
    }finally {
      HibernateUtils.closeSession(session);
    }
  }

User.hbm.xml 코드는 다음과 같으며 단방향 매핑 코드와 동일합니다.

<hibernate-mapping>
  <class name="com.bjpowernode.hibernate.Role" table="t_role">
    <id name="id">
      <generator class="native"/>
    </id>
    <property name="name"/>
    <set name="users" table="t_user_role">
      <key column="role_id" not-null="true"/>
      <many-to-many class="com.bjpowernode.hibernate.User" column="user_id"/>
    </set>
  </class>
</hibernate-mapping>

Role.java 부분은 단방향 user.java와 마찬가지로 컬렉션 매핑 세트를 추가해야 합니다. 코드는 다음과 같습니다.

<hibernate-mapping>
  <class name="com.bjpowernode.hibernate.Role" table="t_role">
    <id name="id">
      <generator class="native"/>
    </id>
    <property name="name"/>
    <set name="users" table="t_user_role">
      <key column="role_id" not-null="true"/>
      <many-to-many class="com.bjpowernode.hibernate.User" column="user_id"/>
    </set>
  </class>
</hibernate-mapping>

User.hbm.xml User.java 코드는 위의 코드와 동일하므로 넣지 않겠습니다. 여기 다 있어요.

요약:

여러 블로그의 소개를 통해 모두가 단방향과 다방향을 이해했다고 믿습니다. 그것은 매우 간단합니다.


읽어주셔서 감사합니다. 도움이 되기를 바랍니다. 이 사이트를 지원해 주셔서 감사합니다!

더 많은 Java Hibernate 다대다 매핑 세부사항 및 예제 코드 관련 기사를 보려면 PHP 중국어 웹사이트에 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.