Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 989a091

Browse files
committed
Lesson 5
1 parent 499fb22 commit 989a091

20 files changed

+850
-49
lines changed

pom.xml

Lines changed: 58 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@
1313

1414
<properties>
1515
<java.version>1.8</java.version>
16+
<tomcat.version>7.0.57</tomcat.version>
1617

1718
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
1819
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
1920

2021
<spring.version>4.1.6.RELEASE</spring.version>
22+
<spring-data-jpa.version>1.8.1.RELEASE</spring-data-jpa.version>
2123

2224
<!-- Logging -->
2325
<logback.version>1.1.2</logback.version>
@@ -29,6 +31,8 @@
2931
<!-- Hibernate -->
3032
<hibernate.version>4.3.8.Final</hibernate.version>
3133
<hibernate-validator.version>5.1.3.Final</hibernate-validator.version>
34+
<!--Tools-->
35+
<ehcache.version>2.6.11</ehcache.version>
3236
</properties>
3337

3438
<build>
@@ -85,7 +89,7 @@
8589
<!-- Spring -->
8690
<dependency>
8791
<groupId>org.springframework</groupId>
88-
<artifactId>spring-context</artifactId>
92+
<artifactId>spring-context-support</artifactId>
8993
<version>${spring.version}</version>
9094
<exclusions>
9195
<exclusion>
@@ -97,21 +101,9 @@
97101

98102
<!--DataBase-->
99103
<dependency>
100-
<groupId>org.postgresql</groupId>
101-
<artifactId>postgresql</artifactId>
102-
<version>9.4-1201-jdbc41</version>
103-
</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-
111-
<dependency>
112-
<groupId>org.springframework</groupId>
113-
<artifactId>spring-orm</artifactId>
114-
<version>${spring.version}</version>
104+
<groupId>org.springframework.data</groupId>
105+
<artifactId>spring-data-jpa</artifactId>
106+
<version>${spring-data-jpa.version}</version>
115107
</dependency>
116108
<dependency>
117109
<groupId>org.hibernate</groupId>
@@ -124,6 +116,19 @@
124116
<version>${hibernate-validator.version}</version>
125117
</dependency>
126118

119+
<!--Tools-->
120+
<dependency>
121+
<groupId>net.sf.ehcache</groupId>
122+
<artifactId>ehcache-core</artifactId>
123+
<version>${ehcache.version}</version>
124+
<exclusions>
125+
<exclusion>
126+
<groupId>commons-logging</groupId>
127+
<artifactId>commons-logging</artifactId>
128+
</exclusion>
129+
</exclusions>
130+
</dependency>
131+
127132
<!--Test-->
128133
<dependency>
129134
<groupId>junit</groupId>
@@ -141,8 +146,45 @@
141146
</dependencies>
142147

143148
<profiles>
149+
<profile>
150+
<id>hsqldb</id>
151+
<dependencies>
152+
<dependency>
153+
<groupId>org.hsqldb</groupId>
154+
<artifactId>hsqldb</artifactId>
155+
<version>2.3.2</version>
156+
</dependency>
157+
</dependencies>
158+
</profile>
159+
<profile>
160+
<id>postgres</id>
161+
<dependencies>
162+
<dependency>
163+
<groupId>org.postgresql</groupId>
164+
<artifactId>postgresql</artifactId>
165+
<version>9.4-1201-jdbc41</version>
166+
</dependency>
167+
<dependency>
168+
<groupId>org.apache.tomcat</groupId>
169+
<artifactId>tomcat-jdbc</artifactId>
170+
<version>${tomcat.version}</version>
171+
</dependency>
172+
</dependencies>
173+
<activation>
174+
<activeByDefault>true</activeByDefault>
175+
</activation>
176+
</profile>
144177
</profiles>
145178

146179
<dependencyManagement>
180+
<dependencies>
181+
<dependency>
182+
<groupId>org.springframework</groupId>
183+
<artifactId>spring-framework-bom</artifactId>
184+
<version>${spring.version}</version>
185+
<type>pom</type>
186+
<scope>import</scope>
187+
</dependency>
188+
</dependencies>
147189
</dependencyManagement>
148190
</project>

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* Date: 22.08.2014
1515
*/
1616
@Entity
17-
@Table(name = "USERS", uniqueConstraints = {@UniqueConstraint(columnNames = "email", name = "unique_email")})
17+
@Table(name = "users", uniqueConstraints = {@UniqueConstraint(columnNames = "email", name = "unique_email")})
1818
@NamedQueries({
1919
@NamedQuery(name = User.DELETE, query = "DELETE FROM User u WHERE u.id=:id"),
2020
@NamedQuery(name = User.BY_EMAIL, query = "SELECT u FROM User u LEFT JOIN FETCH u.roles WHERE u.email=?1"),
@@ -40,7 +40,7 @@ public class User extends NamedEntity {
4040
protected boolean enabled = true;
4141

4242
@Column(name = "registered", columnDefinition = "timestamp default now()")
43-
protected Date registered;
43+
protected Date registered = new Date();
4444

4545
@Enumerated(EnumType.STRING)
4646
@CollectionTable(name = "user_roles", joinColumns = @JoinColumn(name = "user_id"))

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

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,53 @@
11
package ru.javawebinar.topjava.model;
22

3-
import javax.persistence.FetchType;
4-
import javax.persistence.ManyToOne;
3+
import org.hibernate.validator.constraints.NotEmpty;
4+
5+
import javax.persistence.*;
6+
import javax.validation.constraints.NotNull;
57
import java.time.LocalDateTime;
68

79
/**
810
* GKislin
911
* 11.01.2015.
1012
*/
13+
@NamedQueries({
14+
@NamedQuery(name = UserMeal.GET, query = "SELECT m FROM UserMeal m WHERE m.id=:id AND m.user.id=:userId"),
15+
@NamedQuery(name = UserMeal.ALL_SORTED, query = "SELECT m FROM UserMeal m WHERE m.user.id=:userId ORDER BY m.dateTime DESC"),
16+
@NamedQuery(name = UserMeal.DELETE_ALL, query = "DELETE FROM UserMeal i WHERE i.user.id=:userId"),
17+
@NamedQuery(name = UserMeal.DELETE, query = "DELETE FROM UserMeal m WHERE m.id=:id AND m.user.id=:userId"),
18+
@NamedQuery(name = UserMeal.GET_BETWEEN,
19+
query = "SELECT m from UserMeal m WHERE m.user.id=:userId "+
20+
" AND m.dateTime BETWEEN :startDate AND :endDate ORDER BY m.dateTime DESC"),
21+
22+
// @NamedQuery(name = UserMeal.UPDATE, query = "UPDATE UserMeal m SET m.dateTime = :datetime, m.calories= :calories," +
23+
// "m.description=:desc where m.id=:id and m.user.id=:userId")
24+
})
25+
26+
@Entity
27+
@Table(name = "meals")
1128
public class UserMeal extends BaseEntity{
29+
public static final String GET = "UserMeal.get";
30+
public static final String ALL_SORTED = "UserMeal.getAll";
31+
public static final String DELETE = "UserMeal.delete";
32+
public static final String DELETE_ALL = "UserMeal.deleteAll";
33+
public static final String GET_BETWEEN = "UserMeal.getBetween";
34+
// public static final String UPDATE = "UserMeal.update";
35+
36+
@Column(name = "time", nullable = false)
37+
@NotNull
1238
protected LocalDateTime dateTime;
1339

40+
@Column(name = "description", nullable = false)
41+
@NotEmpty
1442
protected String description;
1543

44+
@Column(name = "calories")
1645
protected int calories;
1746

1847
@ManyToOne(fetch = FetchType.LAZY)
48+
@JoinColumn(name = "user_id", nullable = false)
49+
@NotNull
50+
// http://stackoverflow.com/questions/9887242/using-postgresql-why-doesnt-hibernate-jpa-create-cascade-constraints/9925761#9925761
1951
private User user;
2052

2153
public UserMeal() {
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package ru.javawebinar.topjava.model.converter;
2+
3+
import javax.persistence.AttributeConverter;
4+
import javax.persistence.Converter;
5+
import java.sql.Timestamp;
6+
import java.time.LocalDateTime;
7+
8+
/**
9+
* GKislin
10+
* 08.01.2015.
11+
* @link https://weblogs.java.net/blog/montanajava/archive/2014/06/17/using-java-8-datetime-classes-jpa
12+
*/
13+
@Converter(autoApply = true)
14+
public class LocalDateTimeConverter implements AttributeConverter<LocalDateTime, Timestamp> {
15+
@Override
16+
public Timestamp convertToDatabaseColumn(LocalDateTime ldt) {
17+
return Timestamp.valueOf(ldt);
18+
}
19+
20+
@Override
21+
public LocalDateTime convertToEntityAttribute(Timestamp ts) {
22+
return ts.toLocalDateTime();
23+
}
24+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package ru.javawebinar.topjava.repository.datajpa;
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+
* GKislin
12+
* 27.03.2015.
13+
*/
14+
@Repository
15+
public class DataJpaUserMealRepositoryImpl implements UserMealRepository{
16+
@Override
17+
public UserMeal save(UserMeal userMeal, int userId) {
18+
return null;
19+
}
20+
21+
@Override
22+
public boolean delete(int id, int userId) {
23+
return false;
24+
}
25+
26+
@Override
27+
public UserMeal get(int id, int userId) {
28+
return null;
29+
}
30+
31+
@Override
32+
public List<UserMeal> getAll(int userId) {
33+
return null;
34+
}
35+
36+
@Override
37+
public void deleteAll(int userId) {
38+
39+
}
40+
41+
@Override
42+
public List<UserMeal> getBetween(LocalDateTime startDate, LocalDateTime endDate, int userId) {
43+
return null;
44+
}
45+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package ru.javawebinar.topjava.repository.datajpa;
2+
3+
import org.springframework.beans.factory.annotation.Autowired;
4+
import org.springframework.data.domain.Sort;
5+
import org.springframework.stereotype.Repository;
6+
import ru.javawebinar.topjava.model.User;
7+
import ru.javawebinar.topjava.repository.UserRepository;
8+
9+
import java.util.List;
10+
11+
/**
12+
* GKislin
13+
* 27.03.2015.
14+
*/
15+
16+
@Repository
17+
public class DataJpaUserRepositoryImpl implements UserRepository {
18+
private static final Sort SORT_NAME_EMAIL = new Sort("name", "email");
19+
20+
@Autowired
21+
private ProxyUserRepository proxy;
22+
23+
@Override
24+
public User save(User user) {
25+
return proxy.save(user);
26+
}
27+
28+
@Override
29+
public boolean delete(int id) {
30+
return proxy.delete(id) != 0;
31+
}
32+
33+
@Override
34+
public User get(int id) {
35+
return proxy.findOne(id);
36+
}
37+
38+
@Override
39+
public User getByEmail(String email) {
40+
return proxy.getByEmail(email);
41+
}
42+
43+
@Override
44+
public List<User> getAll() {
45+
return proxy.findAll(SORT_NAME_EMAIL);
46+
}
47+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package ru.javawebinar.topjava.repository.datajpa;
2+
3+
import org.springframework.data.domain.Sort;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.data.jpa.repository.Modifying;
6+
import org.springframework.data.jpa.repository.Query;
7+
import org.springframework.data.repository.query.Param;
8+
import org.springframework.transaction.annotation.Transactional;
9+
import ru.javawebinar.topjava.model.User;
10+
11+
import java.util.List;
12+
13+
/**
14+
* GKislin
15+
* 27.03.2015.
16+
*/
17+
@Transactional(readOnly = true)
18+
public interface ProxyUserRepository extends JpaRepository<User, Integer> {
19+
20+
@Transactional
21+
@Modifying
22+
// @Query(name = User.DELETE)
23+
@Query("DELETE FROM User u WHERE u.id=:id")
24+
int delete(@Param("id") int id);
25+
26+
@Override
27+
@Transactional
28+
User save(User user);
29+
30+
@Override
31+
User findOne(Integer id);
32+
33+
@Override
34+
List<User> findAll(Sort sort);
35+
36+
User getByEmail(String email);
37+
}

src/main/java/ru/javawebinar/topjava/repository/jdbc/JdbcUserMealRepositoryImpl.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
99
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
1010
import org.springframework.stereotype.Repository;
11-
import org.springframework.util.CollectionUtils;
1211
import ru.javawebinar.topjava.model.UserMeal;
1312
import ru.javawebinar.topjava.repository.UserMealRepository;
1413

@@ -80,7 +79,7 @@ public void deleteAll(int userId) {
8079
public UserMeal get(int id, int userId) {
8180
List<UserMeal> userMeals = jdbcTemplate.query(
8281
"SELECT * FROM meals WHERE id = ? AND user_id = ?", ROW_MAPPER, id, userId);
83-
return CollectionUtils.isEmpty(userMeals) ? null : DataAccessUtils.requiredSingleResult(userMeals);
82+
return DataAccessUtils.singleResult(userMeals);
8483
}
8584

8685
@Override

0 commit comments

Comments
 (0)