Зависимости в Maven.
Перед тем как приступать к связи с базой данных, необходимо настроить наш проект. Если вы используете Maven для сборки проекта, то вам понадобиться добавить следующие зависимости в pom.xml. Зависимость postgresql нужна только в случае, если вы используете PotgreSQL базу данных. Для других баз данных необходимы другие зависимости, которые можно найти в http://mvnrepository.com/.org.hibernate hibernate-validator 4.2.0.Final org.hibernate hibernate-core 3.6.10.Final org.hibernate hibernate-entitymanager 3.6.10.Final mysql mysql-connector-java 5.1.21 postgresql postgresql 9.1-901.jdbc3
Схема базы данных
Для начала разберемся в моделях. Допустим у нас есть класс Teacher с полями teacherType (тип учителя: TEACHER(0), DIRECTOR(1)), name, email. В таблицу teacher мы хотим запихнуть его тип в виде числа (teacher_type), его имя (name) и мыло (email).
Следующий класс - это Lesson. В нем есть поле teacher - учителя, который ведет этот урок и description - отдельный класс с описание данного урока.
В классе Description есть поля lessonCode, lessonName, lessonNotes.
В таблицу lesson мы хотим засунуть teacher_id учителя, который ведет этот предмет, а так же lesson_code и lesson_name из класса Description.
Для этого мы создаем foreign key от teacher_id каждого урока к id самого учителя.
В классе Lesson также есть поле version для optimistic locking. И в каждом классе есть автогенерируемый id, который генерируется, используя teacher_sequence для Teacher и lesson_sequence для Lesson.
SQL для создания базы данных:
CREATE TABLE teacher ( id bigint NOT NULL primary key, teacher_type integer, name character varying(50), email character varying(40), ); CREATE TABLE lesson ( id bigint NOT NULL primary key, version bigint, teacher_id bigint, lesson_code character varying(20), lesson_name character varying(200), FOREIGN KEY (teacher_id) REFERENCES teacher (id), ); CREATE SEQUENCE teacher_sequence INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 200000 CACHE 1; CREATE SEQUENCE lesson_sequence INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 300000 CACHE 1;
Entity классы
Для того, чтобы объект можно было связать с базой данных, первым делом он должен имплементировать интерфейс Serializable. Затем перед его декларацией должна стоять аннотация @Entity и @Table с именем таблицы, к которой будет привязан класс. Теперь о наиболее часто используемых аннотациях, примеры использования которых можно посмотреть ниже.
@Id - обязательное поле, которое будет использоваться как primary key после.
@Generated Value - создает автогенерацию id. В данном случае генератор использует teacher_sequence, которое объявляется в аннотации @SequenceGenerator.
@Enumerated - аннотация для enum полей класса. EnumType.Ordinal будет сохранять в базе данным только порядковое число енумерации.
@Column - если имя поля отличается от имени колонки в базе данных, следует указать с какой колонкой связать данное поле.
@Embedded - аннотация, чтобы вложить в одну таблицу какой-либо класс. При этом вкладываемый класс должен быть с аннотацией @Embeddable.
@Transient - аннотация, которую нужно указать для тех полей, которые мы не собираемся связывать с базой данных.
@OneToMany, @ManyToOne, @OneToOne, @ManyToMany - аннотации для соотвествующих связей между таблицами.
@NamedQueries - аннотация, в которой хранятся все @NamedQuery.
@NamedQuery - аннотация для создания запросов на JPQL, которые затем можно использовать при запросах в базу данных.
@Version - аннотация для оптимистичного локинга, которая не позволяет одновременно использовать данную Entity несколькими пользователями.
@Version - аннотация для оптимистичного локинга, которая не позволяет одновременно использовать данную Entity несколькими пользователями.
Класс Teacher:
import java.io.Serializable; import java.util.List; import javax.persistence.*; @NamedQueries({ @NamedQuery( name = "GET_TEACHER_BY_NAME_AND_EMAIL", query = "select t from Teacher t where t.name = :name and t.email = :email") }) @Entity @Table(name = "teacher") @SequenceGenerator(name = "teacher_sequence", sequenceName = "teacher_sequence") public class Teacher implements Serializable { public static final String GET_TEACHER_BY_NAME_AND_EMAIL = "GET_TEACHER_BY_NAME_AND_EMAIL"; private long id; private TeacherType teacherType; private String name; private String email; private Listlessons; @Id @GeneratedValue(generator = "teacher_sequence") public final long getId() { return id; } public final void setId(final long id) { this.id = id; } @Enumerated(EnumType.ORDINAL) @Column(name = "teacher_type") public TeacherType getTeacherType() { return teacherType; } public void setTeacherType(final TeacherType teacherType) { this.teacherType = teacherType; } public String getName() { return name; } public void setName(final String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(final String email) { this.email = email; } @OneToMany(mappedBy = "teacher") public List getLessons() { return lessons; } public void setLessons(final List lessons) { this.lessons = lessons; } }
Enum Класс TeacherType:
public enum TeacherType { TEACHER, DIRECTOR; }
Класс Lesson, связанный отношением ManyToOne с классом Teacher:
import javax.persistence.*; import java.io.Serializable; @NamedQueries({ @NamedQuery( name = "GET_ALL_LESSONS", query = "select lesson from Lesson lesson") }) @Entity @Table(name = "lesson") @SequenceGenerator(name = "lesson_sequence", sequenceName = "lesson_sequence") public class Lesson implements Serializable { public static final String GET_ALL_LESSONS = "GET_ALL_LESSONS"; private long id; private Teacher teacher; private Description description; private long version; @Version public long getVersion() { return version; } public void setVersion(final long version) { this.version = version; } @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "teacher_id") public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } @Embedded public Description getDescription() { return description; } public void setDescription(final Description description) { this.description = description; } @Id @GeneratedValue(generator = "lesson_sequence") public final long getId() { return id; } public final void setId(final long id) { this.id = id; } }
Класс Description, поля которого будут хранить в одной таблице с Lesson:
import java.io.Serializable; import javax.persistence.*; @Embeddable public class Description implements Serializable { private String lessonCode; private String lessonName; private String lessonNotes; @Column(name = "lesson_code") public final String getLessonCode() { return lessonCode; } public final void setLessonCode(final String LessonCode) { this.lessonCode = lessonCode; } @Column(name = "lesson_name") public final String getLessonName() { return lessonName; } public final void setLessonName(final String lessonName) { this.lessonName = lessonName; } @Transient public final String getLessonNotes() { return lessonNotes; } public final void setLessonNotes(final String lessonNotes) { this.lessonNotes = lessonNotes; } }
Автор статьи: Александр Картышев
Комментариев нет:
Отправить комментарий