JPA / EclipseLink - получение имен столбцов - PullRequest
3 голосов
/ 07 сентября 2010

Я пытаюсь обновить свои знания в Java, так как в последний раз я использовал их, когда это было в версии 1.4.X ... Я пытаюсь использовать 1.6.0, в частности Java Persistence API (2.0).

Мне удалось создать класс сущностей. Это работает, так как я могу хранить и извлекать данные.

Но я дурачился, и когда я решил заполнить JList именами столбцов таблицы и не добился успеха ...

Это простой класс и выглядит так:

@Entity
@Table(name = "T_CURRENCY", schema = "APP")
public class Currency implements Serializable {
    @Transient
    private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private Short id;
    @Basic(optional = false)
    @Column(name = "NAME")
    private String name;

    ...
}

Есть ли способ получить имена столбцов?

Я нашел это сообщение . Кажется, это правильное решение, но я подумал, что оно может иметь что-то более простое / элегантное? Я не знаю почему, но я ожидал, что уже готовый метод ...

ТИА

Bob

Ответы [ 4 ]

10 голосов
/ 07 сентября 2010

В EclipseLink вы можете получить ClassDescriptor для класса и получить его поля (DatabaseField).

т.е.

em.unwrap(Session.class).getDescriptor(Currency.class).getFields()

Вы также можете получить сопоставления, таблицу или что-нибудь ещежелание.

Видите, http://www.eclipse.org/eclipselink/api/2.1/org/eclipse/persistence/descriptors/ClassDescriptor.html

10 голосов
/ 07 сентября 2010

Вы можете разобрать аннотации столбца:

for (Field field : entity.getClass().getDeclaredFields()) {
   Column column = field.getAnnotation(Column.class);
   if (column != null) {
      columnNames.add(column.name());
   }
}

Обратите внимание, что аннотация Column является необязательной, поэтому вы должны убедиться, что она определена. Если нет, вам придется обратиться к механизму перевода имен, что было бы слишком для этого.

2 голосов
/ 27 августа 2014

Отображение свойств и столбцов из EclipseLink ClassDescriptor

// Get the session object 

org.eclipse.persistence.sessions.Session session = 
     ((org.eclipse.persistence.internal.jpa.EntityManagerImpl) 
                 em.getDelegate()).getSession();

// Get your desire class descriptor and mapping list 

List<org.eclipse.persistence.mappings.DatabaseMapping> datamap = 
     (List) session.getDescriptor(YOUR_ENTITY_CLASS_NAME.class).getMappings();


for (org.eclipse.persistence.mappings.DatabaseMapping dm : datamap) {

  System.out.println(" Attribute name : " + dm.getAttributeName());    // Class field name 
  System.out.println(" Column name : " + dm.getField().getName());     // Database Column name                    

}
  • getFields() возвращает все имена столбцов, которые используются в классе.
  • getMappings() возвращает имя поля класса вместе с именем поля столбца базы данных.
1 голос
/ 07 сентября 2010

Но я дурачился, и когда я решил заполнить JList именами столбцов таблицы и не добился успеха ...

Ну, пока вы можете разобратьВ аннотациях (как указал Божо) весь смысл JPA состоит в том, чтобы каким-то образом абстрагировать имена таблиц и столбцов от бизнес-объектов (которые могут даже использовать значения по умолчанию, делая информацию даже не представленной).Другими словами, я бы не стал полагаться на них, а использовал бы имя класса и имена атрибутов.

...