在这个例子中,我们将看到如何使用注解来实现多对多关系。 让我们以国家和语言为例。一个国家可以有n种语言,一种语言可以被n个国家说。下面是它们之间的关系图。
现在要在数据库中创建上述表,您需要创建两个 java 文件,即 Country.java 和 Language.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 注释用于引用两个表中的链接列。
语言类将用于在数据库中创建 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; } }
在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>
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(); } }
当你运行它时,你会得到以下输出。
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 (?, ?)
数据库中的 COUNTRY 表
数据库中的 LANGUAGE 表
创建 COUNTRY_LANGUAGE 表以链接以上两个表。
<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/