Use EntityOperator to retrieve metadata about primary key and columns.
@@ -7,6 +7,8 @@ | ||
7 | 7 | import java.util.List; |
8 | 8 | import java.util.Map; |
9 | 9 | |
10 | +import jp.sf.amateras.mirage.DefaultEntityOperator; | |
11 | +import jp.sf.amateras.mirage.EntityOperator; | |
10 | 12 | import jp.sf.amateras.mirage.SqlManager; |
11 | 13 | import jp.sf.amateras.mirage.naming.DefaultNameConverter; |
12 | 14 | import jp.sf.amateras.mirage.naming.NameConverter; |
@@ -21,6 +23,7 @@ | ||
21 | 23 | public class MirageTestContext { |
22 | 24 | |
23 | 25 | private static NameConverter nameConverter = new DefaultNameConverter(); |
26 | + private static EntityOperator entityOperator = new DefaultEntityOperator(); | |
24 | 27 | private static List<Object> resultList = new ArrayList<Object>(); |
25 | 28 | private static List<ExecutedSQLInfo> executedSqlList = new ArrayList<ExecutedSQLInfo>(); |
26 | 29 | private static Map<String, Long> sequenceMap = new HashMap<String, Long>(); |
@@ -143,7 +146,7 @@ | ||
143 | 146 | * @param id the values of primary key |
144 | 147 | */ |
145 | 148 | public static void verifyFindSql(int indexOfSql, Class<?> entityClass, Object... id){ |
146 | - verifySql(indexOfSql, MirageUtil.buildSelectSQL(entityClass, nameConverter)); | |
149 | + verifySql(indexOfSql, MirageUtil.buildSelectSQL(entityOperator, entityClass, nameConverter)); | |
147 | 150 | verifyParameters(indexOfSql, id); |
148 | 151 | } |
149 | 152 |
@@ -155,7 +158,7 @@ | ||
155 | 158 | */ |
156 | 159 | public static void verifyInsertSql(int indexOfSql, Object entity){ |
157 | 160 | List<Object> values = new ArrayList<Object>(); |
158 | - verifySql(indexOfSql, MirageUtil.buildInsertSql(entity, nameConverter, values)); | |
161 | + verifySql(indexOfSql, MirageUtil.buildInsertSql(entityOperator, entity, nameConverter, values)); | |
159 | 162 | verifyParameters(indexOfSql, values.toArray()); |
160 | 163 | } |
161 | 164 |
@@ -167,7 +170,7 @@ | ||
167 | 170 | */ |
168 | 171 | public static void verifyUpdatetSql(int indexOfSql, Object entity){ |
169 | 172 | List<Object> values = new ArrayList<Object>(); |
170 | - verifySql(indexOfSql, MirageUtil.buildUpdateSql(entity, nameConverter, values)); | |
173 | + verifySql(indexOfSql, MirageUtil.buildUpdateSql(entityOperator, entity, nameConverter, values)); | |
171 | 174 | verifyParameters(indexOfSql, values.toArray()); |
172 | 175 | } |
173 | 176 |
@@ -179,7 +182,7 @@ | ||
179 | 182 | */ |
180 | 183 | public static void verifyDeleteSql(int indexOfSql, Object entity){ |
181 | 184 | List<Object> values = new ArrayList<Object>(); |
182 | - verifySql(indexOfSql, MirageUtil.buildDeleteSql(entity, nameConverter, values)); | |
185 | + verifySql(indexOfSql, MirageUtil.buildDeleteSql(entityOperator, entity, nameConverter, values)); | |
183 | 186 | verifyParameters(indexOfSql, values.toArray()); |
184 | 187 | } |
185 | 188 |
@@ -53,8 +53,10 @@ | ||
53 | 53 | |
54 | 54 | protected ConnectionProvider connectionProvider; |
55 | 55 | |
56 | - protected NameConverter nameConverter = new DefaultNameConverter(); | |
56 | + protected NameConverter nameConverter; | |
57 | 57 | |
58 | + protected EntityOperator entityOperator; | |
59 | + | |
58 | 60 | protected Dialect dialect = new StandardDialect(); |
59 | 61 | |
60 | 62 | protected SqlExecutor sqlExecutor = new SqlExecutor(); |
@@ -87,8 +89,8 @@ | ||
87 | 89 | addValueType(new ByteArrayValueType()); |
88 | 90 | // addValueType(new jp.sf.amateras.mirage.type.DefaultValueType()); |
89 | 91 | |
90 | - setNameConverter(nameConverter); | |
91 | 92 | setDialect(dialect); |
93 | + setNameConverter(new DefaultNameConverter()); | |
92 | 94 | setEntityOperator(new DefaultEntityOperator()); |
93 | 95 | } |
94 | 96 |
@@ -113,6 +115,7 @@ | ||
113 | 115 | } |
114 | 116 | |
115 | 117 | public void setEntityOperator(EntityOperator entityOperator){ |
118 | + this.entityOperator = entityOperator; | |
116 | 119 | this.sqlExecutor.setEntityOperator(entityOperator); |
117 | 120 | this.callExecutor.setEntityOperator(entityOperator); |
118 | 121 | } |
@@ -224,7 +227,7 @@ | ||
224 | 227 | |
225 | 228 | public int deleteEntity(Object entity) { |
226 | 229 | List<Object> params = new ArrayList<Object>(); |
227 | - String executeSql = MirageUtil.buildDeleteSql(entity, nameConverter, params); | |
230 | + String executeSql = MirageUtil.buildDeleteSql(entityOperator, entity, nameConverter, params); | |
228 | 231 | |
229 | 232 | return sqlExecutor.executeUpdateSql(executeSql, params.toArray(), null); |
230 | 233 | } |
@@ -239,7 +242,7 @@ | ||
239 | 242 | |
240 | 243 | for(Object entity: entities){ |
241 | 244 | List<Object> params = new ArrayList<Object>(); |
242 | - String sql = MirageUtil.buildDeleteSql(entity, nameConverter, params); | |
245 | + String sql = MirageUtil.buildDeleteSql(entityOperator, entity, nameConverter, params); | |
243 | 246 | |
244 | 247 | if(executeSql == null){ |
245 | 248 | executeSql = sql; |
@@ -285,7 +288,7 @@ | ||
285 | 288 | fillPrimaryKeysBySequence(entity); |
286 | 289 | |
287 | 290 | List<Object> params = new ArrayList<Object>(); |
288 | - String sql = MirageUtil.buildInsertSql(entity, nameConverter, params); | |
291 | + String sql = MirageUtil.buildInsertSql(entityOperator, entity, nameConverter, params); | |
289 | 292 | |
290 | 293 | return sqlExecutor.executeUpdateSql(sql, params.toArray(), entity); |
291 | 294 | } |
@@ -302,7 +305,7 @@ | ||
302 | 305 | fillPrimaryKeysBySequence(entity); |
303 | 306 | |
304 | 307 | List<Object> params = new ArrayList<Object>(); |
305 | - String sql = MirageUtil.buildInsertSql(entity, nameConverter, params); | |
308 | + String sql = MirageUtil.buildInsertSql(entityOperator, entity, nameConverter, params); | |
306 | 309 | |
307 | 310 | if(executeSql == null){ |
308 | 311 | executeSql = sql; |
@@ -323,7 +326,7 @@ | ||
323 | 326 | |
324 | 327 | public int updateEntity(Object entity) { |
325 | 328 | List<Object> params = new ArrayList<Object>(); |
326 | - String executeSql = MirageUtil.buildUpdateSql(entity, nameConverter, params); | |
329 | + String executeSql = MirageUtil.buildUpdateSql(entityOperator, entity, nameConverter, params); | |
327 | 330 | |
328 | 331 | return sqlExecutor.executeUpdateSql(executeSql, params.toArray(), null); |
329 | 332 | } |
@@ -338,7 +341,7 @@ | ||
338 | 341 | |
339 | 342 | for(Object entity: entities){ |
340 | 343 | List<Object> params = new ArrayList<Object>(); |
341 | - String sql = MirageUtil.buildUpdateSql(entity, nameConverter, params); | |
344 | + String sql = MirageUtil.buildUpdateSql(entityOperator, entity, nameConverter, params); | |
342 | 345 | |
343 | 346 | if(executeSql == null){ |
344 | 347 | executeSql = sql; |
@@ -359,7 +362,7 @@ | ||
359 | 362 | |
360 | 363 | // @Override |
361 | 364 | public <T> T findEntity(Class<T> clazz, Object... id) { |
362 | - String executeSql = MirageUtil.buildSelectSQL(clazz, nameConverter); | |
365 | + String executeSql = MirageUtil.buildSelectSQL(entityOperator, clazz, nameConverter); | |
363 | 366 | return sqlExecutor.getSingleResult(clazz, executeSql, id); |
364 | 367 | } |
365 | 368 |
@@ -4,7 +4,11 @@ | ||
4 | 4 | import java.sql.ResultSetMetaData; |
5 | 5 | import java.util.List; |
6 | 6 | |
7 | +import jp.sf.amateras.mirage.annotation.Column; | |
8 | +import jp.sf.amateras.mirage.annotation.PrimaryKey; | |
9 | +import jp.sf.amateras.mirage.annotation.PrimaryKey.GenerationType; | |
7 | 10 | import jp.sf.amateras.mirage.bean.BeanDesc; |
11 | +import jp.sf.amateras.mirage.bean.PropertyDesc; | |
8 | 12 | import jp.sf.amateras.mirage.dialect.Dialect; |
9 | 13 | import jp.sf.amateras.mirage.naming.NameConverter; |
10 | 14 | import jp.sf.amateras.mirage.type.ValueType; |
@@ -40,4 +44,58 @@ | ||
40 | 44 | ResultSetMetaData meta, int columnCount, BeanDesc beanDesc, |
41 | 45 | Dialect dialect, List<ValueType<?>> valueTypes, NameConverter nameConverter); |
42 | 46 | |
47 | + /** | |
48 | + * Retrieves the metadata of the primary key from the given PropertyDesc. | |
49 | + * | |
50 | + * @param clazz the entity class | |
51 | + * @param propertyDesc the property description | |
52 | + * @param nameConverter the NameConverter | |
53 | + * @return the metadata of the primary key | |
54 | + */ | |
55 | + public PrimaryKeyInfo getPrimaryKeyInfo(Class<?> clazz, | |
56 | + PropertyDesc propertyDesc, NameConverter nameConverter); | |
57 | + | |
58 | + /** | |
59 | + * Retrieves the metadata of the column from the given PropertyDesc. | |
60 | + * | |
61 | + * @param clazz the entity class | |
62 | + * @param propertyDesc the property description | |
63 | + * @param nameConverter the NameConverter | |
64 | + * @return the metadata of the column | |
65 | + */ | |
66 | + public ColumnInfo getColumnInfo(Class<?> clazz, | |
67 | + PropertyDesc propertyDesc, NameConverter nameConverter); | |
68 | + | |
69 | + /** | |
70 | + * DTO for metadata of the primary key which is specified by {@link PrimaryKey} annotation. | |
71 | + * | |
72 | + * @see PrimaryKey | |
73 | + */ | |
74 | + public class PrimaryKeyInfo { | |
75 | + public GenerationType generationType; | |
76 | + public String generator; | |
77 | + | |
78 | + public PrimaryKeyInfo(GenerationType generationType){ | |
79 | + this(generationType, null); | |
80 | + } | |
81 | + | |
82 | + public PrimaryKeyInfo(GenerationType generationType, String generator){ | |
83 | + this.generationType = generationType; | |
84 | + this.generator = generator; | |
85 | + } | |
86 | + } | |
87 | + | |
88 | + /** | |
89 | + * DTO for metadata of the column which is specified by {@link Column} annotation. | |
90 | + * | |
91 | + * @see Column | |
92 | + */ | |
93 | + public class ColumnInfo { | |
94 | + public String name; | |
95 | + | |
96 | + public ColumnInfo(String name){ | |
97 | + this.name = name; | |
98 | + } | |
99 | + } | |
100 | + | |
43 | 101 | } |
@@ -12,6 +12,7 @@ | ||
12 | 12 | import java.util.logging.Logger; |
13 | 13 | |
14 | 14 | import jp.sf.amateras.mirage.annotation.Column; |
15 | +import jp.sf.amateras.mirage.annotation.PrimaryKey; | |
15 | 16 | import jp.sf.amateras.mirage.bean.BeanDesc; |
16 | 17 | import jp.sf.amateras.mirage.bean.PropertyDesc; |
17 | 18 | import jp.sf.amateras.mirage.dialect.Dialect; |
@@ -133,4 +134,22 @@ | ||
133 | 134 | } |
134 | 135 | } |
135 | 136 | |
137 | + public PrimaryKeyInfo getPrimaryKeyInfo(Class<?> clazz, | |
138 | + PropertyDesc propertyDesc, NameConverter nameConverter) { | |
139 | + PrimaryKey primaryKey = propertyDesc.getAnnotation(PrimaryKey.class); | |
140 | + if(primaryKey == null){ | |
141 | + return null; | |
142 | + } | |
143 | + return new PrimaryKeyInfo(primaryKey.generationType(), primaryKey.generator()); | |
144 | + } | |
145 | + | |
146 | + public ColumnInfo getColumnInfo(Class<?> clazz, | |
147 | + PropertyDesc propertyDesc, NameConverter nameConverter) { | |
148 | + Column column = propertyDesc.getAnnotation(Column.class); | |
149 | + if(column == null){ | |
150 | + return null; | |
151 | + } | |
152 | + return new ColumnInfo(column.name()); | |
153 | + } | |
154 | + | |
136 | 155 | } |
@@ -2,8 +2,10 @@ | ||
2 | 2 | |
3 | 3 | import java.util.List; |
4 | 4 | |
5 | +import jp.sf.amateras.mirage.EntityOperator; | |
6 | +import jp.sf.amateras.mirage.EntityOperator.ColumnInfo; | |
7 | +import jp.sf.amateras.mirage.EntityOperator.PrimaryKeyInfo; | |
5 | 8 | import jp.sf.amateras.mirage.annotation.Column; |
6 | -import jp.sf.amateras.mirage.annotation.PrimaryKey; | |
7 | 9 | import jp.sf.amateras.mirage.annotation.PrimaryKey.GenerationType; |
8 | 10 | import jp.sf.amateras.mirage.annotation.Table; |
9 | 11 | import jp.sf.amateras.mirage.bean.BeanDesc; |
@@ -183,10 +185,10 @@ | ||
183 | 185 | * @param nameConverter the name converter |
184 | 186 | * @return the column name |
185 | 187 | */ |
186 | - public static String getColumnName(PropertyDesc pd, NameConverter nameConverter){ | |
187 | - Column column = pd.getAnnotation(Column.class); | |
188 | + public static String getColumnName(EntityOperator entityOperator, Class<?> clazz, PropertyDesc pd, NameConverter nameConverter){ | |
189 | + ColumnInfo column = entityOperator.getColumnInfo(clazz, pd, nameConverter); | |
188 | 190 | if(column != null){ |
189 | - return column.name(); | |
191 | + return column.name; | |
190 | 192 | } else { |
191 | 193 | return nameConverter.propertyToColumn(pd.getPropertyName()); |
192 | 194 | } |
@@ -200,7 +202,7 @@ | ||
200 | 202 | * @return Select SQL |
201 | 203 | * @throws RuntimeException the entity class has no primary keys |
202 | 204 | */ |
203 | - public static String buildSelectSQL(Class<?> clazz, NameConverter nameConverter){ | |
205 | + public static String buildSelectSQL(EntityOperator entityOperator, Class<?> clazz, NameConverter nameConverter){ | |
204 | 206 | StringBuilder sb = new StringBuilder(); |
205 | 207 | BeanDesc beanDesc = BeanDescFactory.getBeanDesc(clazz); |
206 | 208 |
@@ -212,11 +214,12 @@ | ||
212 | 214 | |
213 | 215 | for(int i=0; i<beanDesc.getPropertyDescSize(); i++){ |
214 | 216 | PropertyDesc pd = beanDesc.getPropertyDesc(i); |
215 | - if(pd.getAnnotation(PrimaryKey.class) != null){ | |
217 | + PrimaryKeyInfo primaryKey = entityOperator.getPrimaryKeyInfo(clazz, pd, nameConverter); | |
218 | + if(primaryKey != null){ | |
216 | 219 | if(count != 0){ |
217 | 220 | sb.append(" AND "); |
218 | 221 | } |
219 | - sb.append(MirageUtil.getColumnName(pd, nameConverter)); | |
222 | + sb.append(MirageUtil.getColumnName(entityOperator, clazz, pd, nameConverter)); | |
220 | 223 | sb.append(" = ?"); |
221 | 224 | count++; |
222 | 225 | } |
@@ -237,22 +240,23 @@ | ||
237 | 240 | * @param params the list of parameters |
238 | 241 | * @return Insert SQL |
239 | 242 | */ |
240 | - public static String buildInsertSql(Object entity, NameConverter nameConverter, List<Object> params){ | |
243 | + public static String buildInsertSql(EntityOperator entityOperator, Object entity, NameConverter nameConverter, List<Object> params){ | |
241 | 244 | StringBuilder sb = new StringBuilder(); |
242 | - BeanDesc beanDesc = BeanDescFactory.getBeanDesc(entity.getClass()); | |
245 | + Class<?> clazz = entity.getClass(); | |
246 | + BeanDesc beanDesc = BeanDescFactory.getBeanDesc(clazz); | |
243 | 247 | |
244 | - sb.append("INSERT INTO ").append(getTableName(entity.getClass(), nameConverter)).append(" ("); | |
248 | + sb.append("INSERT INTO ").append(getTableName(clazz, nameConverter)).append(" ("); | |
245 | 249 | { |
246 | 250 | int count = 0; |
247 | - for(int i=0;i<beanDesc.getPropertyDescSize();i++){ | |
251 | + for(int i = 0; i < beanDesc.getPropertyDescSize(); i++){ | |
248 | 252 | PropertyDesc pd = beanDesc.getPropertyDesc(i); |
249 | - PrimaryKey primaryKey = pd.getAnnotation(PrimaryKey.class); | |
250 | - if((primaryKey == null || primaryKey.generationType() != GenerationType.IDENTITY) | |
253 | + PrimaryKeyInfo primaryKey = entityOperator.getPrimaryKeyInfo(clazz, pd, nameConverter); | |
254 | + if((primaryKey == null || primaryKey.generationType != GenerationType.IDENTITY) | |
251 | 255 | && !pd.isTransient() && pd.isReadable() ){ |
252 | 256 | if(count != 0){ |
253 | 257 | sb.append(", "); |
254 | 258 | } |
255 | - sb.append(getColumnName(pd, nameConverter)); | |
259 | + sb.append(getColumnName(entityOperator, clazz, pd, nameConverter)); | |
256 | 260 | count++; |
257 | 261 | } |
258 | 262 | } |
@@ -260,10 +264,10 @@ | ||
260 | 264 | sb.append(") VALUES ("); |
261 | 265 | { |
262 | 266 | int count = 0; |
263 | - for(int i=0;i<beanDesc.getPropertyDescSize();i++){ | |
267 | + for(int i = 0; i < beanDesc.getPropertyDescSize(); i++){ | |
264 | 268 | PropertyDesc pd = beanDesc.getPropertyDesc(i); |
265 | - PrimaryKey primaryKey = pd.getAnnotation(PrimaryKey.class); | |
266 | - if((primaryKey == null || primaryKey.generationType() != GenerationType.IDENTITY) | |
269 | + PrimaryKeyInfo primaryKey = entityOperator.getPrimaryKeyInfo(clazz, pd, nameConverter); | |
270 | + if((primaryKey == null || primaryKey.generationType != GenerationType.IDENTITY) | |
267 | 271 | && !pd.isTransient() && pd.isReadable() ){ |
268 | 272 | if(count != 0){ |
269 | 273 | sb.append(", "); |
@@ -289,21 +293,23 @@ | ||
289 | 293 | * @param params the list of parameters |
290 | 294 | * @return Update SQL |
291 | 295 | */ |
292 | - public static String buildUpdateSql(Object entity, NameConverter nameConverter, List<Object> params){ | |
296 | + public static String buildUpdateSql(EntityOperator entityOperator, Object entity, NameConverter nameConverter, List<Object> params){ | |
293 | 297 | StringBuilder sb = new StringBuilder(); |
298 | + Class<?> clazz = entity.getClass(); | |
294 | 299 | |
295 | - sb.append("UPDATE ").append(getTableName(entity.getClass(), nameConverter)).append(" SET "); | |
300 | + sb.append("UPDATE ").append(getTableName(clazz, nameConverter)).append(" SET "); | |
296 | 301 | |
297 | - BeanDesc beanDesc = BeanDescFactory.getBeanDesc(entity.getClass()); | |
302 | + BeanDesc beanDesc = BeanDescFactory.getBeanDesc(clazz); | |
298 | 303 | { |
299 | 304 | int count = 0; |
300 | 305 | for (int i = 0; i < beanDesc.getPropertyDescSize(); i++) { |
301 | 306 | PropertyDesc pd = beanDesc.getPropertyDesc(i); |
302 | - if(pd.getAnnotation(PrimaryKey.class) == null && !pd.isTransient() && pd.isReadable() ){ | |
307 | + PrimaryKeyInfo primaryKey = entityOperator.getPrimaryKeyInfo(clazz, pd, nameConverter); | |
308 | + if(primaryKey == null && !pd.isTransient() && pd.isReadable() ){ | |
303 | 309 | if (count != 0) { |
304 | 310 | sb.append(", "); |
305 | 311 | } |
306 | - sb.append(getColumnName(pd, nameConverter)).append(" = ?"); | |
312 | + sb.append(getColumnName(entityOperator, clazz, pd, nameConverter)).append(" = ?"); | |
307 | 313 | params.add(pd.getValue(entity)); |
308 | 314 | count++; |
309 | 315 | } |
@@ -314,11 +320,12 @@ | ||
314 | 320 | int count = 0; |
315 | 321 | for (int i = 0; i < beanDesc.getPropertyDescSize(); i++) { |
316 | 322 | PropertyDesc pd = beanDesc.getPropertyDesc(i); |
317 | - if(pd.getAnnotation(PrimaryKey.class) != null && pd.isReadable() ){ | |
323 | + PrimaryKeyInfo primaryKey = entityOperator.getPrimaryKeyInfo(clazz, pd, nameConverter); | |
324 | + if(primaryKey != null && pd.isReadable() ){ | |
318 | 325 | if(count != 0){ |
319 | 326 | sb.append(" AND "); |
320 | 327 | } |
321 | - sb.append(getColumnName(pd, nameConverter)).append(" = ? "); | |
328 | + sb.append(getColumnName(entityOperator, clazz, pd, nameConverter)).append(" = ? "); | |
322 | 329 | params.add(pd.getValue(entity)); |
323 | 330 | count++; |
324 | 331 | } |
@@ -340,7 +347,7 @@ | ||
340 | 347 | * @param params the list of parameters |
341 | 348 | * @return Delete SQL |
342 | 349 | */ |
343 | - public static String buildDeleteSql(Object entity, NameConverter nameConverter, List<Object> params){ | |
350 | + public static String buildDeleteSql(EntityOperator entityOperator, Object entity, NameConverter nameConverter, List<Object> params){ | |
344 | 351 | StringBuilder sb = new StringBuilder(); |
345 | 352 | sb.append("DELETE FROM ").append(getTableName(entity.getClass(), nameConverter)); |
346 | 353 | sb.append(" WHERE "); |
@@ -347,15 +354,17 @@ | ||
347 | 354 | |
348 | 355 | boolean hasPrimaryKey = false; |
349 | 356 | |
350 | - BeanDesc beanDesc = BeanDescFactory.getBeanDesc(entity.getClass()); | |
357 | + Class<?> clazz = entity.getClass(); | |
358 | + BeanDesc beanDesc = BeanDescFactory.getBeanDesc(clazz); | |
351 | 359 | |
352 | 360 | for(int i=0;i<beanDesc.getPropertyDescSize();i++){ |
353 | 361 | PropertyDesc pd = beanDesc.getPropertyDesc(i); |
354 | - if(pd.getAnnotation(PrimaryKey.class) != null && pd.isReadable()){ | |
362 | + PrimaryKeyInfo primaryKey = entityOperator.getPrimaryKeyInfo(clazz, pd, nameConverter); | |
363 | + if(primaryKey != null && pd.isReadable()){ | |
355 | 364 | if(!params.isEmpty()){ |
356 | 365 | sb.append(" AND "); |
357 | 366 | } |
358 | - sb.append(getColumnName(pd, nameConverter)).append("=?"); | |
367 | + sb.append(getColumnName(entityOperator, clazz, pd, nameConverter)).append("=?"); | |
359 | 368 | params.add(pd.getValue(entity)); |
360 | 369 | hasPrimaryKey = true; |
361 | 370 | } |