· 8 years ago · Jun 23, 2018, 12:22 PM
1<dependencies>
2 <dependency>
3 <groupId>org.springframework</groupId>
4 <artifactId>spring-context-support</artifactId>
5 <version>${spring.version}</version>
6 </dependency>
7 <dependency>
8 <groupId>org.springframework</groupId>
9 <artifactId>spring-test</artifactId>
10 <version>${spring.version}</version>
11 </dependency>
12 <dependency>
13 <groupId>mysql</groupId>
14 <artifactId>mysql-connector-java</artifactId>
15 <version>${mysql.version}</version>
16 </dependency>
17 <dependency>
18 <groupId>org.apache.commons</groupId>
19 <artifactId>commons-dbcp2</artifactId>
20 <version>${commons.dbcp.version}</version>
21 </dependency>
22 <dependency>
23 <groupId>org.springframework</groupId>
24 <artifactId>spring-tx</artifactId>
25 <version>${spring.version}</version>
26 </dependency>
27 <dependency>
28 <groupId>junit</groupId>
29 <artifactId>junit</artifactId>
30 <version>4.12</version>
31 </dependency>
32 <dependency>
33 <groupId>org.hibernate</groupId>
34 <artifactId>hibernate-entitymanager</artifactId>
35 <version>5.2.10.Final</version>
36 </dependency>
37 <dependency>
38 <groupId>org.springframework.data</groupId>
39 <artifactId>spring-data-jpa</artifactId>
40 <version>1.11.13.RELEASE</version>
41 </dependency>
42 </dependencies>
43
44DROP TABLE IF EXISTS `property` ;
45CREATE TABLE IF NOT EXISTS `property` (
46 `id` VARCHAR(60) NOT NULL,
47 `supplier_id` VARCHAR(30) NOT NULL,
48 `url` VARCHAR(255) NOT NULL,
49 `main_pic` VARCHAR(255) NOT NULL,
50 `lat` DOUBLE NOT NULL,
51 `lng` DOUBLE NOT NULL,
52 `sys_type` VARCHAR(30) NOT NULL,
53 `name` VARCHAR(255) NOT NULL,
54 `description` TEXT NOT NULL,
55 `one_liner` VARCHAR(255) NOT NULL DEFAULT '',
56 `num_bedrooms` TINYINT(127) NOT NULL,
57 `num_bathrooms` TINYINT(127) NOT NULL,
58 `max_occ` TINYINT(127) NOT NULL,
59 `country` CHAR(2) NOT NULL,
60 `rating` DOUBLE NOT NULL DEFAULT 0,
61 `num_raters` INT NOT NULL DEFAULT 0,
62 `rank` DOUBLE NOT NULL DEFAULT 0,
63 `lowest_ppn` DOUBLE NOT NULL DEFAULT 0,
64 `max_ppn` DOUBLE NOT NULL DEFAULT 0,
65 `avg_ppn` DOUBLE NOT NULL DEFAULT 0,
66 `private_pool` TINYINT(1) NOT NULL DEFAULT 0,
67 `pool` TINYINT(1) NOT NULL DEFAULT 0,
68 `internet_access` TINYINT(1) NOT NULL DEFAULT 0,
69 `air_conditioning` TINYINT(1) NOT NULL DEFAULT 0,
70 `bbq` TINYINT(1) NOT NULL DEFAULT 0,
71 `satellite` TINYINT(1) NOT NULL DEFAULT 0,
72 `hot_tub` TINYINT(1) NOT NULL DEFAULT 0,
73 `sauna` TINYINT(1) NOT NULL DEFAULT 0,
74 `parking` TINYINT(1) NOT NULL DEFAULT 0,
75 `instant_book` TINYINT(1) NOT NULL DEFAULT 0,
76 `updated` DATETIME NOT NULL DEFAULT NOW(),
77 PRIMARY KEY (`id`, `supplier_id`))
78ENGINE = InnoDB;
79
80@Entity
81@Table(name="property")
82public class Property {
83
84 @EmbeddedId
85 private PropertyCompositeKey id;
86 @NotNull
87 @Column(name="url")
88 private String url;
89 @Column(name="main_pic")
90 @NotNull
91 private String mainPic;
92 @Column(name="lat")
93 @Min(-180)
94 @Max(180)
95 @NotNull
96 private Double lat;
97 @Column(name="lng")
98 @Min(-90)
99 @Max(90)
100 @NotNull
101 private Double lng;
102 @Column(name="type")
103 @NotNull
104 private String externalType;
105 @Column(name="name")
106 @NotNull
107 private String name;
108 @Column(name="description")
109 @NotNull
110 private String description;
111 @Column(name="num_bedrooms")
112 @Min(1)
113 @NotNull
114 private Integer numBedrooms;
115 @Column(name="num_bathrooms")
116 @Min(1)
117 @NotNull
118 private Integer numBathrooms;
119 @Column(name="max_occ")
120 @Min(1)
121 @NotNull
122 private Integer maxOcc;
123 @Column(name="country")
124 @Length(min=2,max=2)
125 @NotNull
126 private String country;
127 @Column(name="rating")
128 private Double rating;
129 @Column(name="num_raters")
130 private Integer numRaters;
131 @Column(name="rank")
132 private Double rank;
133 @Column(name="lowest_ppn")
134 @Min(1)
135 private Double lowestPpn;
136 @Column(name="max_ppn")
137 @Min(1)
138 private Double maxPpn;
139 @Column(name="avg_ppn")
140 @Min(1)
141 private Double avgPpn;
142 @Column(name="private_pool")
143 private Boolean privatePool;
144 @Column(name="pool")
145 private Boolean pool;
146 @Column(name="internet_access")
147 private Boolean internetAccess;
148 @Column(name="air_conditioning")
149 private Boolean airConditioning;
150 @Column(name="bbq")
151 private Boolean bbq;
152 @Column(name="satellite")
153 private Boolean satellite;
154 @Column(name="hot_tub")
155 private Boolean hotTub;
156 @Column(name="sauna")
157 private Boolean sauna;
158 @Column(name="parking")
159 private Boolean parking;
160 @Column(name="instant_book")
161 private Boolean instantBook;
162 @Column(name="updated")
163 @Version
164 private Timestamp updated;
165
166 public void setKey(String id, String supplierId) {
167 PropertyCompositeKey pck = new PropertyCompositeKey();
168 pck.setId(id);
169 pck.setSupplierId(supplierId);
170 this.id = pck;
171 }
172}
173
174@Embeddable
175public class PropertyCompositeKey implements Serializable {
176
177 /**
178 *
179 */
180 private static final long serialVersionUID = 6575008230123343148L;
181 @Column(name="id")
182 @NotNull
183 private String id;
184 @Column(name="supplier_id")
185 @NotNull
186 private String supplierId;
187}
188
189@Repository
190public interface PropertyRepository extends JpaRepository<Property, PropertyCompositeKey> {
191
192}
193
194public interface PropertiesService {
195
196 Property save(Property property);
197}
198
199@Service
200public class PropertyServiceImpl implements PropertiesService {
201
202 @Autowired
203 private PropertyRepository repo;
204
205 @Override
206 @Transactional
207 public Property save(Property property) {
208 Property saved = repo.save(property);
209 return saved;
210 }
211
212}
213
214@Configuration
215@EnableJpaRepositories("property.dao")
216@EnableTransactionManagement
217@PropertySource(
218 value={"classpath:/properties.properties"},
219 ignoreResourceNotFound = false)
220@ComponentScan(basePackages={"property.properties"})
221public class PropertySpringConfig {
222
223 @Bean
224 public static PropertySourcesPlaceholderConfigurer propertyConfigurer() {
225 return new PropertySourcesPlaceholderConfigurer();
226 }
227 @Bean
228 public DataSource dataSource(@Value("${jdbc.driverClassName}") String driverClass,
229 @Value("${jdbc.url}") String url,
230 @Value("${jdbc.username}") String un,
231 @Value("${jdbc.password}") String pw,
232 @Value("${jdbc.minIdleConnections}") int mi,
233 @Value("${jdbc.initialPoolSize}") int is) {
234 BasicDataSource ds = new BasicDataSource();
235 ds.setDriverClassName(driverClass);
236 ds.setUrl(url);
237 ds.setUsername(un);
238 ds.setPassword(pw);
239 ds.setMinIdle(mi);
240 ds.setInitialSize(is);
241 return ds;
242 }
243
244 @Bean
245 public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
246 LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
247 em.setDataSource(dataSource);
248 em.setPackagesToScan(new String[] { "property.entity" });
249 JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
250 em.setJpaVendorAdapter(vendorAdapter);
251 em.setJpaProperties(additionalProperties());
252 return em;
253 }
254
255 @Bean
256 public PlatformTransactionManager transactionManager(LocalContainerEntityManagerFactoryBean entityManagerFactory, DataSource ds) {
257 JpaTransactionManager jtm = new JpaTransactionManager();
258 jtm.setEntityManagerFactory(entityManagerFactory.getNativeEntityManagerFactory());
259 jtm.setDataSource(ds);
260 return jtm;
261 }
262
263 Properties additionalProperties() {
264 Properties properties = new Properties();
265 properties.setProperty(
266 "hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
267 return properties;
268 }
269}
270
271@RunWith(SpringJUnit4ClassRunner.class)
272@ContextConfiguration(loader=AnnotationConfigContextLoader.class,classes=PropertySpringConfig.class)
273public class TestRepository {
274
275 @Autowired
276 private PropertiesService propertyRepository;
277
278 @Test
279 @Commit
280 public void testRepository() {
281 Property p = new Property();
282 p.setKey("TEST_ID", "TEST_SUPPLIER");
283 p.setAirConditioning(true);
284 p.setAvgPpn(500.0);
285 p.setCountry("ES");
286 p.setDescription("TEST DESCRIPTION");
287 p.setExternalType("TEST");
288 p.setHotTub(false);
289 p.setLat(12.5);
290 p.setLng(45.6);
291 p.setLowestPpn(150.4);
292 p.setMainPic("TEST");
293 p.setMaxOcc(5);
294 p.setMaxPpn(777.4);
295 p.setName("TEST NAME");
296 p.setNumBathrooms(3);
297 p.setNumBedrooms(7);
298 p.setNumRaters(5);
299 p.setPrivatePool(true);
300 p.setRank(1.0);
301 p.setRating(4.5);
302 p.setUrl("TEST");
303 Property s = propertyRepository.save(p);
304
305 }
306}
307
308DEBUG: org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl