Таким образом, использование 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 .