Skip to content

Commit e80cfdb

Browse files
author
gkislin@yandex.ru
committed
Add JPA
1 parent 6847825 commit e80cfdb

8 files changed

Lines changed: 155 additions & 6 deletions

File tree

pom.xml

Lines changed: 15 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>
@@ -102,9 +106,19 @@
102106
</dependency>
103107
<dependency>
104108
<groupId>org.springframework</groupId>
105-
<artifactId>spring-jdbc</artifactId>
109+
<artifactId>spring-orm</artifactId>
106110
<version>${spring.version}</version>
107111
</dependency>
112+
<dependency>
113+
<groupId>org.hibernate</groupId>
114+
<artifactId>hibernate-entitymanager</artifactId>
115+
<version>${hibernate.version}</version>
116+
</dependency>
117+
<dependency>
118+
<groupId>org.hibernate</groupId>
119+
<artifactId>hibernate-validator</artifactId>
120+
<version>${hibernate-validator.version}</version>
121+
</dependency>
108122

109123
<!--Test-->
110124
<dependency>

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

Lines changed: 7 additions & 1 deletion
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() {
@@ -47,5 +54,4 @@ public boolean equals(Object o) {
4754
public int hashCode() {
4855
return (id == null) ? 0 : id;
4956
}
50-
5157
}

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: 19 additions & 1 deletion
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,17 +13,30 @@
813
* User: gkislin
914
* Date: 22.08.2014
1015
*/
16+
@Entity
17+
@Table(name = "USERS", uniqueConstraints = {@UniqueConstraint(columnNames = "email", name = "unique_email")})
1118
public class User extends NamedEntity {
1219

20+
@Column(name = "email", nullable = false, unique = true)
21+
@Email
22+
@NotEmpty
1323
protected String email;
1424

15-
// Length(min = 5)
25+
@Column(name = "password", nullable = false)
26+
@NotEmpty
27+
@Length(min = 5)
1628
protected String password;
1729

30+
@Column(name = "enabled", nullable = false)
1831
protected boolean enabled = true;
1932

33+
@Column(name = "registered", columnDefinition = "timestamp default now()")
2034
protected Date registered;
2135

36+
@Enumerated(EnumType.STRING)
37+
@CollectionTable(name = "user_roles", joinColumns = @JoinColumn(name = "user_id"))
38+
@Column(name = "role")
39+
@ElementCollection(fetch = FetchType.EAGER)
2240
protected Set<Role> roles;
2341

2442
public User() {

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import ru.javawebinar.topjava.util.TimeUtil;
44

5+
import javax.persistence.FetchType;
6+
import javax.persistence.ManyToOne;
57
import java.time.LocalDateTime;
68

79
/**
@@ -15,6 +17,7 @@ public class UserMeal extends BaseEntity {
1517

1618
protected int calories;
1719

20+
@ManyToOne(fetch = FetchType.LAZY)
1821
private User user;
1922

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

src/main/resources/db/postgres.properties

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,7 @@ database.init=true
88
#database.url=jdbc:postgresql://localhost:5432/topjava02
99
#database.username=user
1010
#database.password=user
11+
12+
jpa.showSql=true
13+
hibernate.format_sql=true
14+
hibernate.use_sql_comments=true

src/main/resources/spring/spring-db.xml

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
<beans xmlns="http://www.springframework.org/schema/beans"
22
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3-
xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
3+
xmlns:p="http://www.springframework.org/schema/p"
4+
xmlns:context="http://www.springframework.org/schema/context"
5+
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
46
xsi:schemaLocation="http://www.springframework.org/schema/beans
57
http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd">
68

79
<context:property-placeholder location="classpath:db/postgres.properties" system-properties-mode="OVERRIDE"/>
810

9-
<context:component-scan base-package="ru.javawebinar.**.repository.jdbc"/>
10-
1111
<jdbc:initialize-database data-source="dataSource" enabled="${database.init}">
1212
<jdbc:script location="classpath:db/initDB.sql"/>
1313
<jdbc:script location="classpath:db/populateDB.sql"/>
@@ -26,11 +26,38 @@
2626
<property name="password" value="${database.password}"/>
2727
</bean>
2828

29+
<context:component-scan base-package="ru.javawebinar.**.repository.jpa"/>
30+
31+
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
32+
p:dataSource-ref="dataSource"
33+
p:packagesToScan="ru.gkislin.**.model">
34+
<!--p:persistenceUnitName="persistenceUnit">-->
35+
36+
<property name="jpaPropertyMap">
37+
<map>
38+
<entry key="#{T(org.hibernate.cfg.AvailableSettings).FORMAT_SQL}" value="${hibernate.format_sql}"/>
39+
<entry key="#{T(org.hibernate.cfg.AvailableSettings).USE_SQL_COMMENTS}"
40+
value="${hibernate.use_sql_comments}"/>
41+
<!--<entry key="#{T(org.hibernate.cfg.AvailableSettings).HBM2DDL_AUTO}" value="${hibernate.hbm2ddl.auto}"/>-->
42+
</map>
43+
</property>
44+
45+
<property name="jpaVendorAdapter">
46+
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
47+
p:showSql="${jpa.showSql}"
48+
p:databasePlatform="org.hibernate.dialect.PostgreSQL9Dialect" >
49+
</bean>
50+
</property>
51+
</bean>
52+
53+
<!--
54+
<context:component-scan base-package="ru.javawebinar.**.repository.jdbc"/>
2955
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
3056
<constructor-arg ref="dataSource"/>
3157
</bean>
3258
3359
<bean id="namedJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
3460
<constructor-arg ref="dataSource"/>
3561
</bean>
62+
-->
3663
</beans>

0 commit comments

Comments
 (0)