Skip to content

Commit 499fb22

Browse files
committed
lesson_4
1 parent ea660d5 commit 499fb22

21 files changed

Lines changed: 299 additions & 66 deletions

pom.xml

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@
2525

2626
<!-- Tests -->
2727
<junit.version>4.12</junit.version>
28+
29+
<!-- Hibernate -->
30+
<hibernate.version>4.3.8.Final</hibernate.version>
31+
<hibernate-validator.version>5.1.3.Final</hibernate-validator.version>
2832
</properties>
2933

3034
<build>
@@ -97,11 +101,28 @@
97101
<artifactId>postgresql</artifactId>
98102
<version>9.4-1201-jdbc41</version>
99103
</dependency>
104+
<dependency>
105+
<groupId>org.hsqldb</groupId>
106+
<artifactId>hsqldb</artifactId>
107+
<version>2.3.2</version>
108+
<scope>test</scope>
109+
</dependency>
110+
100111
<dependency>
101112
<groupId>org.springframework</groupId>
102-
<artifactId>spring-jdbc</artifactId>
113+
<artifactId>spring-orm</artifactId>
103114
<version>${spring.version}</version>
104115
</dependency>
116+
<dependency>
117+
<groupId>org.hibernate</groupId>
118+
<artifactId>hibernate-entitymanager</artifactId>
119+
<version>${hibernate.version}</version>
120+
</dependency>
121+
<dependency>
122+
<groupId>org.hibernate</groupId>
123+
<artifactId>hibernate-validator</artifactId>
124+
<version>${hibernate-validator.version}</version>
125+
</dependency>
105126

106127
<!--Test-->
107128
<dependency>

src/main/java/ru/javawebinar/topjava/model/BaseEntity.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,22 @@
22

33
import ru.javawebinar.topjava.LoggerWrapper;
44

5+
import javax.persistence.*;
6+
57
/**
68
* User: gkislin
79
* Date: 22.08.2014
810
*/
11+
@MappedSuperclass
12+
@Access(AccessType.FIELD)
913
public class BaseEntity {
1014
protected static final LoggerWrapper LOG = LoggerWrapper.get(BaseEntity.class);
1115

1216
public static final int START_SEQ = 100000;
1317

18+
@Id
19+
@SequenceGenerator(name = "global_seq", sequenceName = "global_seq", allocationSize = 1)
20+
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "global_seq")
1421
protected Integer id;
1522

1623
public BaseEntity() {

src/main/java/ru/javawebinar/topjava/model/NamedEntity.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
11
package ru.javawebinar.topjava.model;
22

3+
import org.hibernate.validator.constraints.NotEmpty;
4+
5+
import javax.persistence.Column;
6+
import javax.persistence.MappedSuperclass;
7+
38
/**
49
* User: gkislin
510
* Date: 22.08.2014
611
*/
12+
@MappedSuperclass
713
public class NamedEntity extends BaseEntity {
814

15+
@NotEmpty
16+
@Column(name = "name", nullable = false)
917
protected String name;
1018

1119
public NamedEntity() {

src/main/java/ru/javawebinar/topjava/model/User.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
package ru.javawebinar.topjava.model;
22

3+
import org.hibernate.validator.constraints.Email;
4+
import org.hibernate.validator.constraints.Length;
5+
import org.hibernate.validator.constraints.NotEmpty;
6+
7+
import javax.persistence.*;
38
import java.util.Date;
49
import java.util.EnumSet;
510
import java.util.Set;
@@ -8,16 +13,39 @@
813
* User: gkislin
914
* Date: 22.08.2014
1015
*/
16+
@Entity
17+
@Table(name = "USERS", uniqueConstraints = {@UniqueConstraint(columnNames = "email", name = "unique_email")})
18+
@NamedQueries({
19+
@NamedQuery(name = User.DELETE, query = "DELETE FROM User u WHERE u.id=:id"),
20+
@NamedQuery(name = User.BY_EMAIL, query = "SELECT u FROM User u LEFT JOIN FETCH u.roles WHERE u.email=?1"),
21+
@NamedQuery(name = User.ALL_SORTED, query = "SELECT u FROM User u LEFT JOIN FETCH u.roles ORDER BY u.name, u.email"),
22+
})
1123
public class User extends NamedEntity {
1224

25+
public static final String DELETE = "User.delete";
26+
public static final String ALL_SORTED = "User.getAllSorted";
27+
public static final String BY_EMAIL = "User.getByEmail";
28+
29+
@Column(name = "email", nullable = false, unique = true)
30+
@Email
31+
@NotEmpty
1332
protected String email;
1433

34+
@Column(name = "password", nullable = false)
35+
@NotEmpty
36+
@Length(min = 5)
1537
protected String password;
1638

39+
@Column(name = "enabled", nullable = false)
1740
protected boolean enabled = true;
1841

42+
@Column(name = "registered", columnDefinition = "timestamp default now()")
1943
protected Date registered;
2044

45+
@Enumerated(EnumType.STRING)
46+
@CollectionTable(name = "user_roles", joinColumns = @JoinColumn(name = "user_id"))
47+
@Column(name = "role")
48+
@ElementCollection(fetch = FetchType.EAGER)
2149
protected Set<Role> roles;
2250

2351
public User() {

src/main/java/ru/javawebinar/topjava/model/UserMeal.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package ru.javawebinar.topjava.model;
22

3+
import javax.persistence.FetchType;
4+
import javax.persistence.ManyToOne;
35
import java.time.LocalDateTime;
46

57
/**
@@ -13,6 +15,7 @@ public class UserMeal extends BaseEntity{
1315

1416
protected int calories;
1517

18+
@ManyToOne(fetch = FetchType.LAZY)
1619
private User user;
1720

1821
public UserMeal() {
@@ -49,4 +52,4 @@ public void setUser(User user) {
4952
public String toString() {
5053
return "Meal(" + id + ", " + dateTime + ", '" + description + "', calories:" + calories + ')';
5154
}
52-
}
55+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package ru.javawebinar.topjava.repository.jpa;
2+
3+
import org.springframework.stereotype.Repository;
4+
import ru.javawebinar.topjava.model.UserMeal;
5+
import ru.javawebinar.topjava.repository.UserMealRepository;
6+
7+
import java.time.LocalDateTime;
8+
import java.util.List;
9+
10+
/**
11+
* User: gkislin
12+
* Date: 26.08.2014
13+
*/
14+
15+
@Repository
16+
public class JpaUserMealRepositoryImpl implements UserMealRepository {
17+
18+
@Override
19+
public UserMeal save(UserMeal userMeal, int userId) {
20+
return null;
21+
}
22+
23+
@Override
24+
public boolean delete(int id, int userId) {
25+
return false;
26+
}
27+
28+
@Override
29+
public UserMeal get(int id, int userId) {
30+
return null;
31+
}
32+
33+
@Override
34+
public List<UserMeal> getAll(int userId) {
35+
return null;
36+
}
37+
38+
@Override
39+
public void deleteAll(int userId) {
40+
41+
}
42+
43+
@Override
44+
public List<UserMeal> getBetween(LocalDateTime startDate, LocalDateTime endDate, int userId) {
45+
return null;
46+
}
47+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package ru.javawebinar.topjava.repository.jpa;
2+
3+
import org.springframework.stereotype.Repository;
4+
import org.springframework.transaction.annotation.Transactional;
5+
import ru.javawebinar.topjava.model.User;
6+
import ru.javawebinar.topjava.repository.UserRepository;
7+
8+
import javax.persistence.EntityManager;
9+
import javax.persistence.PersistenceContext;
10+
import java.util.List;
11+
12+
/**
13+
* User: gkislin
14+
* Date: 29.08.2014
15+
*/
16+
@Repository
17+
@Transactional(readOnly = true)
18+
public class JpaUserRepositoryImpl implements UserRepository {
19+
20+
/*
21+
@Autowired
22+
private SessionFactory sessionFactory;
23+
24+
private Session openSession() {
25+
return sessionFactory.getCurrentSession();
26+
}
27+
*/
28+
29+
@PersistenceContext
30+
private EntityManager em;
31+
32+
@Override
33+
@Transactional
34+
public User save(User user) {
35+
if (user.isNew()) {
36+
em.persist(user);
37+
} else {
38+
em.merge(user);
39+
}
40+
return user;
41+
}
42+
43+
@Override
44+
public User get(int id) {
45+
return em.find(User.class, id);
46+
}
47+
48+
@Override
49+
@Transactional
50+
public boolean delete(int id) {
51+
52+
/*
53+
User ref = em.getReference(User.class, id);
54+
em.remove(ref);
55+
56+
TypedQuery<User> query = em.createQuery("DELETE FROM User u WHERE u.id=:id", User.class);
57+
return query.setParameter("id", id).executeUpdate() != 0;
58+
*/
59+
return em.createNamedQuery(User.DELETE).setParameter("id", id).executeUpdate() != 0;
60+
}
61+
62+
@Override
63+
public User getByEmail(String email) {
64+
return em.createNamedQuery(User.BY_EMAIL, User.class).setParameter(1, email).getSingleResult();
65+
}
66+
67+
@Override
68+
public List<User> getAll() {
69+
return em.createNamedQuery(User.ALL_SORTED, User.class).getResultList();
70+
}
71+
}

src/main/java/ru/javawebinar/topjava/util/DbPopulator.java

Lines changed: 0 additions & 28 deletions
This file was deleted.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#database.url=jdbc:hsqldb:file:D:/temp/topjava
2+
database.url=jdbc:hsqldb:mem:topjava
3+
4+
database.username=sa
5+
database.password=
6+
database.driverClassName=org.hsqldb.jdbcDriver
7+
8+
database.init=true
9+
jdbc.initLocation=initDB_hsql.sql
10+
jpa.showSql=true
11+
hibernate.format_sql=true
12+
hibernate.use_sql_comments=true
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
DROP TABLE user_roles IF EXISTS;
2+
DROP TABLE meals IF EXISTS;
3+
DROP TABLE users IF EXISTS;
4+
DROP SEQUENCE global_seq IF EXISTS;
5+
6+
CREATE SEQUENCE GLOBAL_SEQ AS INTEGER START WITH 100000;
7+
8+
CREATE TABLE users
9+
(
10+
id INTEGER GENERATED BY DEFAULT AS SEQUENCE GLOBAL_SEQ PRIMARY KEY,
11+
name VARCHAR(255),
12+
email VARCHAR(255) NOT NULL,
13+
password VARCHAR(255) NOT NULL,
14+
registered TIMESTAMP DEFAULT now(),
15+
enabled BOOLEAN DEFAULT TRUE
16+
);
17+
CREATE UNIQUE INDEX user_email_key ON USERS ( email );
18+
19+
CREATE TABLE user_roles
20+
(
21+
user_id INTEGER NOT NULL,
22+
role VARCHAR(255),
23+
CONSTRAINT user_roles_idx UNIQUE (user_id, role),
24+
FOREIGN KEY ( user_id ) REFERENCES USERS ( id ) ON DELETE CASCADE
25+
);
26+
27+
CREATE TABLE meals
28+
(
29+
id INTEGER GENERATED BY DEFAULT AS SEQUENCE GLOBAL_SEQ PRIMARY KEY,
30+
datetime TIMESTAMP,
31+
description VARCHAR(255),
32+
calories INT,
33+
user_id INTEGER NOT NULL,
34+
FOREIGN KEY ( user_id ) REFERENCES USERS ( id ) ON DELETE CASCADE
35+
);

0 commit comments

Comments
 (0)