ElementCollection
is used to save collection of objects. For example, let’s say I had employee
table, I want to save all the addresses where he lived into my database. Table
structure looks like below.
Employee Table
Id
|
firstName
|
lastName
|
1
|
Hari
Krishna
|
Gurram
|
Address table
employeeId
|
Street
|
City
|
State
|
PIN
|
Country
|
1
|
Chowdeswari
street
|
Bangalore
|
Karnataka
|
560037
|
India
|
1
|
Punur
|
Ongole
|
Andhra
Pradesh
|
523169
|
India
|
employeeId
is a foregin key which mapped to primary key of employee table.
package myFirstHibernate; import javax.persistence.Embeddable; @Embeddable public class Address { private String street; private String city; private String state; private String PIN; private String country; public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getState() { return state; } public void setState(String state) { this.state = state; } public String getPIN() { return PIN; } public void setPIN(String pIN) { PIN = pIN; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } }
package myFirstHibernate; import java.util.List; import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.Id; @Entity public class Employee { @Id private int id; private String firstName; private String lastName; @ElementCollection List<Address> addresses; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public List<Address> getAddresses() { return addresses; } public void setAddresses(List<Address> addresses) { this.addresses = addresses; } }
hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- Database Connection settings --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost/sample</property> <property name="connection.username">root</property> <property name="connection.password">tiger</property> <!-- Enable the logging of all the generated SQL statements to the console --> <property name="show_sql">true</property> <!-- Format the generated SQL statement to make it more readable, --> <property name="format_sql">false</property> <!-- Hibernate will put comments inside all generated SQL statements to hint what’s the generated SQL trying to do --> <property name="use_sql_comments">false</property> <!-- This property makes Hibernate generate the appropriate SQL for the chosen database. --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- Drop and re-create the database schema on startup --> <property name="hbm2ddl.auto">create</property> <!-- mappings for annotated classes --> <mapping class="myFirstHibernate.Employee" /> </session-factory> </hibernate-configuration>
package myFirstHibernate; import java.util.ArrayList; import java.util.List; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; public class TestEmployee { /* Step 1: Create session factory */ private static SessionFactory getSessionFactory() { Configuration configuration = new Configuration().configure(); StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder(). applySettings(configuration.getProperties()); SessionFactory factory = configuration.buildSessionFactory(builder.build()); return factory; } public static void main(String args[]){ Employee emp1 = new Employee(); emp1.setId(1); emp1.setFirstName("Hari Krishna"); emp1.setLastName("Gurram"); Address addr1 = new Address(); addr1.setCity("Bangalore"); addr1.setCountry("India"); addr1.setPIN("560037"); addr1.setState("Karnataka"); addr1.setStreet("Chowdeswari street"); Address addr2 = new Address(); addr2.setCity("Ongole"); addr2.setCountry("India"); addr2.setPIN("523169"); addr2.setState("Andhra Pradesh"); addr2.setStreet("Punuru"); List<Address> addrList = new ArrayList<Address> (); addrList.add(addr1); addrList.add(addr2); emp1.setAddresses(addrList); /* To persisit data */ SessionFactory sessionFactory = getSessionFactory(); Session session = sessionFactory.openSession(); session.beginTransaction(); session.save(emp1); session.getTransaction().commit(); session.close(); } }
Run
TestEmployee class, you will get output like below.
Hibernate: alter table Employee_addresses drop foreign key FK_hn80eevxprxh782syyhjvedn6 Hibernate: drop table if exists Employee Hibernate: drop table if exists Employee_addresses Hibernate: create table Employee (id integer not null, firstName varchar(255), lastName varchar(255), primary key (id)) Hibernate: create table Employee_addresses (Employee_id integer not null, PIN varchar(255), city varchar(255), country varchar(255), state varchar(255), street varchar(255)) Hibernate: alter table Employee_addresses add constraint FK_hn80eevxprxh782syyhjvedn6 foreign key (Employee_id) references Employee (id) Dec 20, 2014 10:59:25 PM org.hibernate.tool.hbm2ddl.SchemaExport execute INFO: HHH000230: Schema export complete Hibernate: insert into Employee (firstName, lastName, id) values (?, ?, ?) Hibernate: insert into Employee_addresses (Employee_id, PIN, city, country, state, street) values (?, ?, ?, ?, ?, ?) Hibernate: insert into Employee_addresses (Employee_id, PIN, city, country, state, street) values (?, ?, ?, ?, ?, ?)
As
you see output, table name given to collection of address is “Employee_addresses”
(is combination of Employee class and list of addresses(List<Address>
addresses;
)
name. We can change this naming using JoinTable annotation. I will explain this
in next post.
Table
structures looks like below.
mysql> describe employee; +-----------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+--------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | firstName | varchar(255) | YES | | NULL | | | lastName | varchar(255) | YES | | NULL | | +-----------+--------------+------+-----+---------+-------+ 3 rows in set (0.01 sec) mysql> describe employee_addresses; +-------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------+--------------+------+-----+---------+-------+ | Employee_id | int(11) | NO | MUL | NULL | | | PIN | varchar(255) | YES | | NULL | | | city | varchar(255) | YES | | NULL | | | country | varchar(255) | YES | | NULL | | | state | varchar(255) | YES | | NULL | | | street | varchar(255) | YES | | NULL | | +-------------+--------------+------+-----+---------+-------+ 6 rows in set (0.01 sec) mysql> select * from employee; +----+--------------+----------+ | id | firstName | lastName | +----+--------------+----------+ | 1 | Hari Krishna | Gurram | +----+--------------+----------+ 1 row in set (0.00 sec) mysql> select * from employee_addresses; +-------------+--------+-----------+---------+----------------+--------------------+ | Employee_id | PIN | city | country | state | street | +-------------+--------+-----------+---------+----------------+--------------------+ | 1 | 560037 | Bangalore | India | Karnataka | Chowdeswari street | | 1 | 523169 | Ongole | India | Andhra Pradesh | Punuru | +-------------+--------+-----------+---------+----------------+--------------------+ 2 rows in set (0.00 sec)
Prevoius Next Home
No comments:
Post a Comment