Hibernate 多对多映射示例


在这个例子中,我们将看到如何使用注解来实现多对多关系。 让我们以国家和语言为例。一个国家可以有n种语言,一种语言可以被n个国家说。下面是它们之间的关系图。

img

现在要在数据库中创建上述表,您需要创建两个 java 文件,即 Country.java 和 Language.java。

1.Country.java

Country 类将用于在数据库中创建 COUNTRY 表。 在 src->org.arpit.javapostsforlearning 中创建 C ountry.java

package org.arpit.javapostsforlearning;
import java.util.ArrayList;
import java.util.Collection;
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.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

@Entity
@Table(name="COUNTRY")
public class Country {

@Id
@GeneratedValue
@Column(name="Country_Id")
int countryId;

@Column(name="Country_Name")
    String countryName ;

@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name="COUNTRY_LANGUAGE",joinColumns={@JoinColumn(name="Country_Id")},inverseJoinColumns={@JoinColumn(name="Language_Id")})
Collection languages=new ArrayList();

public Country()
{

}
    public Country(String countryName) {
  this.countryName=countryName;
}

public String getCountryName() {
        return countryName;
    }

    public void setCountryName(String countryName) {
        this.countryName = countryName;
    }

public Collection getLanguages() {
  return languages;
}

public void setLanguages(ArrayList languages) {
  this.languages = languages;
}
}

@MamyToMany 注释用于在 Country 和 Language 实体之间创建多对多关系。@JoinTable 注释用于创建 COUNTRY_LANGUAGE 链接表,@JoinColumn 注释用于引用两个表中的链接列。

2.Langauge.java

语言类将用于在数据库中创建 LANGUAGE 表。 在 src->org.arpit.javapostsforlearning 中创建Langauge.java

package org.arpit.javapostsforlearning;import javax.persistence.Column;
import java.util.ArrayList;
import java.util.Collection;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

@Entity
@Table(name="LANGUAGE")
public class Language {

@Id
@GeneratedValue
@Column(name="Language_Id")
int languageId;

@Column(name="Language_Name")
String languageName;

@ManyToMany(mappedBy="languages")
Collection languageSpeakingCountries=new ArrayList();

public Language()
{

}
public Language(String languageName) {
  this.languageName=languageName;
}

public String getLanguageName() {
  return languageName;
}

public void setLanguageName(String languageName) {
  this.languageName = languageName;
}

public Collection getLanguageSpeakingCountries() {
  return languageSpeakingCountries;
}

public void setLanguageSpeakingCountries(ArrayList languageSpeakingCountries) {
  this.languageSpeakingCountries = languageSpeakingCountries;
}
}

3.Hiberante.cfg.xml:

在src文件夹中创建一个名为“hibernate.cfg.xml”的 文件。

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <!-- Database connection settings -->
        <property name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
        <property name="connection.url">jdbc:sqlserver://localhost:1433;database=UserInfo</property>
        <property name="connection.username">sa</property>
        <property name="connection.password"></property>

        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.SQLServer2005Dialect</property>

        <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>

        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">create</property>

  <mapping class="org.arpit.javapostsforlearning.Country"></mapping>
  <mapping class="org.arpit.javapostsforlearning.Language"></mapping>

    </session-factory>

</hibernate-configuration>

4.Main Class:

package org.arpit.javapostsforlearning;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

public class HibernateMain {

public static void main(String[] args) {

  Country country=new Country("India");

  Language hindiLan=new Language("Hindi");
  hindiLan.getLanguageSpeakingCountries().add(country);

  Language engLan=new Language("English");
  engLan.getLanguageSpeakingCountries().add(country);

  country.getLanguages().add(hindiLan);
  country.getLanguages().add(engLan);

  Configuration configuration=new Configuration();
  configuration.configure();
  ServiceRegistry sr= new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
  SessionFactory sf=configuration.buildSessionFactory(sr);
  Session ss=sf.openSession();

  ss.beginTransaction();
  ss.save(country);
  ss.getTransaction().commit();
  ss.close();

}
}

项目结构:

img

5.运行:

当你运行它时,你会得到以下输出。

Hibernate: create table COUNTRY (Country_Id int identity not null, Country_Name varchar(255), primary key (Country_Id))
Hibernate: create table COUNTRY_LANGUAGE (Country_Name int not null, Language_Name int not null)
Hibernate: create table LANGUAGE (Language_Id int identity not null, Language_Name varchar(255), primary key (Language_Id))
Hibernate: alter table COUNTRY_LANGUAGE add constraint FK67645601403CB4F4 foreign key (Language_Name) references LANGUAGE
Hibernate: alter table COUNTRY_LANGUAGE add constraint FK6764560165CEDD60 foreign key (Country_Name) references COUNTRY
Feb 03, 2013 12:07:59 AM org.hibernate.tool.hbm2ddl.SchemaExport execute
INFO: HHH000230: Schema export complete
Hibernate: insert into COUNTRY (Country_Name) values (?)
Hibernate: insert into LANGUAGE (Language_Name) values (?)
Hibernate: insert into LANGUAGE (Language_Name) values (?)
Hibernate: insert into COUNTRY_LANGUAGE (Country_Name, Language_Name) values (?, ?)
Hibernate: insert into COUNTRY_LANGUAGE (Country_Name, Language_Name) values (?, ?)

5.SQL输出:

数据库中的 COUNTRY 表

img

数据库中的 LANGUAGE 表

img

创建 COUNTRY_LANGUAGE 表以链接以上两个表。

img

源代码:

<b>Source:</b><a href="https://dl.dropbox.com/s/770ug5wofbciekt/ManyToManyMappingExample.zip" target="_blank">Download without jars files</a>
<b>Source + lib</b>: <a href="https://dl.dropbox.com/s/ydj8ijjbdwe8btm/ManyToManyMappingExampleWithJars.zip" target="_blank">Download with jar files</a>


原文链接:https://codingdict.com/