Таким образом, использование JPA, Hibernate или EBeans — это круто, когда вы можете просто комментировать свои классы Java, но разве вы не хотели, чтобы вы могли «сгенерировать» документацию вашей модели данных из кода? Получение информации о JPA / Hibernate и других проверочных аннотациях?
Предполагая, что у вас есть все эти хорошие аннотации в ваших бобах
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
@Entity@Table(name = "project_bills")public class Bill extends Model { private static final long serialVersionUID = 1L; @Id @Column(name="PBI_ID") public Long id; @DoubleFormat @Column(name="PBI_BILL_AMOUNT",length=22) public Double billAmount; @Column(name="PBI_BILL_DATE") @DateTime(pattern="dd.MM.yyyy") public Date billDate; @Column(name="PBI_BILL_NUMBER",length=10) public String billNumber; @Column(name="PBI_CAN_BILL") public Boolean canBill; @Column(name="PBI_COMMENT",length=65535) public String comment; @Column(name="PBI_PAID_DATE") @DateTime(pattern="dd.MM.yyyy") public Date paidDate; |
Вот пример того, как выполнить эту задачу:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
public static String listEntities(String _package) { StringBuffer retval = new StringBuffer(); Reflections reflections = new Reflections(_package, Play.application().classloader()); Set<Class<?>> classes = reflections.getTypesAnnotatedWith(javax.persistence.Entity.class); for (Class c : classes) { retval.append(c.getName() + "\n"); retval.append(listAnnotations(c.getName()) + "\n\n"); retval.append(listAttributes(c.getName()) + "\n\n"); } return retval.toString(); } public static String listAnnotations(String _class) { StringBuffer retval = new StringBuffer(); try { Annotation[] annotations = Class.forName(_class).getAnnotations(); if (annotations.length != 0) { for (int j = 0; j < annotations.length; j++) { retval.append(annotations[j].toString() + ": " + annotations[j].annotationType() + "\n"); } retval.append("\n"); } } catch (ClassNotFoundException e) { System.out.println(e.toString()); return retval.toString(); } return retval.toString(); } public static String listAttributes(String _class) { StringBuffer retval2 = new StringBuffer(); boolean perstistent = false; try { for (Field field : Class.forName(_class).getDeclaredFields()) { Class type = field.getType(); String name = field.getName(); perstistent = false; StringBuffer retval = new StringBuffer(); retval.append("\t" + name + " (" + type + ")\n"); Annotation[] annotations = field.getDeclaredAnnotations(); if (annotations.length != 0) { for (int j = 0; j < annotations.length; j++) { retval.append(annotations[j].toString() + ": " + annotations[j].annotationType() + "\n"); if (annotations[j].toString().startsWith("@javax.persistence")) { perstistent = true; } } retval.append("\n"); } if (perstistent) { retval2.append(retval); } } } catch (ClassNotFoundException e) { System.out.println(e.toString()); return retval2.toString(); } return retval2.toString(); } |
Который будет генерировать что-то вроде этого:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
models.controlling.Bill@javax.persistence.Table(schema=, uniqueConstraints=[], catalog=, name=project_bills): interface javax.persistence.Table@javax.persistence.Entity(name=): interface javax.persistence.Entity id (class java.lang.Long)@javax.persistence.Id(): interface javax.persistence.Id@javax.persistence.Column(insertable=true, scale=0, unique=false, precision=0, columnDefinition=, name=PBI_ID, updatable=true, length=255, nullable=true, table=): interface javax.persistence.Column billAmount (class java.lang.Double)@utils.data.formatters.Formats$DoubleFormat(): interface utils.data.formatters.Formats$DoubleFormat@javax.persistence.Column(insertable=true, scale=0, unique=false, precision=0, columnDefinition=, name=PBI_BILL_AMOUNT, updatable=true, length=22, nullable=true, table=): interface javax.persistence.Column billDate (class java.util.Date)@javax.persistence.Column(insertable=true, scale=0, unique=false, precision=0, columnDefinition=, name=PBI_BILL_DATE, updatable=true, length=255, nullable=true, table=): interface javax.persistence.Column@play.data.format.Formats$DateTime(pattern=dd.MM.yyyy): interface play.data.format.Formats$DateTime billNumber (class java.lang.String)@javax.persistence.Column(insertable=true, scale=0, unique=false, precision=0, columnDefinition=, name=PBI_BILL_NUMBER, updatable=true, length=10, nullable=true, table=): interface javax.persistence.Column |
Конечно, это только верхушка айсберга, но вы поняли.
Ссылка: Как использовать Reflection для документирования вашей модели данных на основе аннотаций JPA от нашего партнера по JCG Брайана Портера в блоге Poornerd .