> Java > java지도 시간 > 본문

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

高洛峰
풀어 주다: 2017-01-23 11:43:34
원래의
1113명이 탐색했습니다.

java Hibernate 다대다 매핑

머리말:

1 단방향 다대다

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

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

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

코드 부분 :

(1) 매핑 및 관계 클래스

단방향 관계이므로 다음만 필요합니다. 한 쪽 끝에 유지되므로 User.hbm.xml 구성 파일에 태그를 추가하고, 해당 열 관계를 태그에 추가하고, ; 새로운 테이블 생성을 나타내는 테이블, 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. 양방향 다대다 매핑

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

양방향이므로 동시에 양방향 컬렉션 매핑을 추가해야 합니다. 여러 쌍을 추가하려면 구성 파일에 태그를 추가하세요. 여러 태그의 경우 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 중국어 웹사이트에 주목하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿