В этом уроке мы увидим, как реализовать наследование в hibernate. Есть 3 способа, которыми вы можете реализовать наследование в hibernate. В этом посте мы увидим один из них, т.е. одну таблицу на иерархию классов.
Наследование в спящем режиме:
Java является объектно-ориентированным языком, а наследование является одной из основных функциональных возможностей java. Модель отношений может реализовывать отношения «есть» и «имеет», но hibernate предоставляет нам способ реализации иерархии классов различными способами.
Одна таблица на иерархию классов:
Допустим, у нас есть следующая иерархия классов. У нас есть класс формы в качестве базового класса, а Rectangle и Circle наследуются от класса Shape.
В одной таблице на иерархию классов будет создана одна таблица для вышеуказанной иерархии. Т.е. будет создана таблица SHAPE, имеющая следующую структуру.
Как видите, создана только одна таблица (SHAPE), имеющая также атрибуты подклассов. В соответствии с приведенной выше диаграммой классов мы создадим три класса: Shape.java, Rectangle.java и Circle.java.
1.Shape.java
Это наш корневой класс иерархии классов сущностей.
Создайте Shape.java в src-> org.arpit.javaposts для обучения.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
package org.arpit.javapostsforlearning; import javax.persistence.Column; import javax.persistence.DiscriminatorColumn; import javax.persistence.DiscriminatorValue; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; import javax.persistence.Table; import javax.persistence.DiscriminatorType; @Entity @Table (name= 'SHAPE' ) @Inheritance (strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn ( name= 'Discriminator' , discriminatorType=DiscriminatorType.STRING ) @DiscriminatorValue (value= 'S' ) public class Shape { @Id @GeneratedValue @Column (name= 'Shape_Id' ) int shapeId; @Column (name= 'Shape_Name' ) String shapeName; public Shape() { } public Shape(String shapeName) { this .shapeName=shapeName; } //getters and setters } |
Shape — это наш корневой класс, поэтому для реализации наследования необходимо использовать некоторые аннотации с корневым классом.
@Inheritance:
Для реализации наследования в hiberante используется аннотация @ Inheritance. Она определяет стратегию наследования, которая будет реализована для иерархии классов сущностей. Для одной таблицы на иерархию классов мы использовали Single_Table в качестве стратегии наследования. Эта аннотация определяется на корневом уровне или уровне подчиненной иерархии. где должна применяться другая стратегия.
@DiscriminatorColumn:
Эта аннотация используется для определения столбца дискриминатора для Single_Table и объединенной стратегии. Она используется для различения разных экземпляров класса. Эта аннотация определяется на корневом уровне или уровне иерархии, где должна применяться другая стратегия. Если аннотация @DiscriminatorColumn не указана, то hibernate создаст столбец с именем «DType», а DiscriminatorType будет строкой.
@DiscriminatorValue:
Эта аннотация определяет значение в столбце дискриминатора для этого класса. Это может быть применено только к конкретному классу сущности. Например, если запись будет иметь экземпляр формы в таблице SHAPE, тогда ‘s’ будет значением для этой строки в столбце дискриминатора. Если это аннотация не указана, и используется столбец «Дискриминатор», тогда будут предоставлены специфические для провайдера значения, а если тип «Дискриминатор» — «Строка», то значением дискриминатора будет имя объекта.
2.Rectangle.java
Это наш детский класс.
Создайте Rectangle.java в src-> org.arpit.javapostsforlearning.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
package org.arpit.javapostsforlearning; import javax.persistence.Column; import javax.persistence.Column; import javax.persistence.DiscriminatorValue; import javax.persistence.Entity; @Entity @DiscriminatorValue (value= 'R' ) public class Rectangle extends Shape{ @Column (name= 'Rectangle_Length' ) int length; @Column (name= 'Rectangle_Breadth' ) int breadth; // getters and setters public Rectangle() { } public Rectangle(String shapeName, int length, int breadth) { super (shapeName); this .length=length; this .breadth=breadth; } // getters and setters } |
3.Circle.java
Это наш второй детский класс.
Создайте Circle.java в src-> org.arpit.javaposts для обучения.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
package org.arpit.javapostsforlearning; import javax.persistence.Column; import javax.persistence.Column; import javax.persistence.DiscriminatorValue; import javax.persistence.Entity; @Entity @DiscriminatorValue (value= "R" ) public class Rectangle extends Shape{ @Column (name= "Rectangle_Length" ) int length; @Column (name= "Rectangle_Breadth" ) int breadth; // getters and setters public Rectangle() { } public Rectangle(String shapeName, int length, int breadth) { super (shapeName); this .length=length; this .breadth=breadth; } // getters and setters } |
4.Hiberante.cfg.xml:
Создайте файл с именем «hibernate.cfg.xml» в папке src .
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
<? xml version = '1.0' encoding = 'utf-8' ?> <! DOCTYPE hibernate-configuration PUBLIC '-//Hibernate/Hibernate Configuration DTD 3.0//EN' < 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.Shape' ></ mapping > < mapping class = 'org.arpit.javapostsforlearning.Rectangle' ></ mapping > < mapping class = 'org.arpit.javapostsforlearning.Circle' ></ mapping > </ session-factory > </ hibernate-configuration > |
5. Основной класс:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
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) { Shape shape= new Shape( 'Sqaure' ); Rectangle rectangle= new Rectangle( 'Rectangle' , 10 , 20 ); Circle circle= new Circle( 'Circle' , 4 ); 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(shape); ss.save(rectangle); ss.save(circle); ss.getTransaction().commit(); ss.close(); } } |
6. Запустите это:
Когда вы запустите его, вы получите следующий вывод.
1
2
3
4
5
6
|
Hibernate: create table SHAPE (Discriminator varchar( 31 ) not null , Shape_Id int identity not null , Shape_Name varchar( 255 ), Rectangle_Breadth int , Rectangle_Length int , Circle_Radius int , primary key (Shape_Id)) Feb 04 , 2013 11 : 01 : 36 PM org.hibernate.tool.hbm2ddl.SchemaExport execute INFO: HHH000230: Schema export complete Hibernate: insert into SHAPE (Shape_Name, Discriminator) values (?, 'S' ) Hibernate: insert into SHAPE (Shape_Name, Rectangle_Breadth, Rectangle_Length, Discriminator) values (?, ?, ?, 'R' ) Hibernate: insert into SHAPE (Shape_Name, Circle_Radius, Discriminator) values (?, ?, 'C' ) |
Выход 7.SQL:
Таблица формы в базе данных.
Ссылка: Hibernate наследование: таблица по иерархии классов от нашего партнера по JCG Арпит Мандлия в рамках фреймворков Java и шаблонов проектирования для начинающих .