views:

81

answers:

3

Hi,

I'm trying to update my knowledge in Java, since I last used in when it was in 1.4.X version... I'm trying to use 1.6.0, in particular the Java Persistence API (2.0).

I managed to create an entity class. It's working, since I'm able to store and retrieve data.

But I was fooling around and when I decided to fill a JList with the column names of a table and didn't got success...

It's a simple class and looks like:

@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;

    ...
}

Is there a way to retrieve the columns names?

I found this post. Seems to be a valid solution, but I thought that it might have something more easier/elegant? I don't know why, but I was expecting an already done method...

TIA,

Bob

+1  A: 

You can parse the column annotations:

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

Note that the Column annotation is optional, so you must make sure you have it defined. If not you will have to consult the name translation mechanism, which would be too much for this.

Bozho
Column annotation is optional
unbeli
I know it is. But in his case it is not. I'll add a note about it.
Bozho
+1  A: 

But I was fooling around and when I decided to fill a JList with the column names of a table and didn't got success...

Well, while you can parse the annotations (as pointed out by Bozho), the whole point of JPA is somehow to abstract table and column names from the business objects (that could even use defaults, making the information not even present). In other words, I wouldn't rely on them but rather use the class name and the attribute names.

Pascal Thivent
I was actually hoping that the Metadata API in JPA 2.0 will have something to offer, but as far as I understand it doesn't include Column information.
Bozho
Correct, the Metadata API does not include column info.
James
+2  A: 

In EclipseLink you can get the ClassDescriptor for a class and get its fields (DatabaseField).

i.e.

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

You can also get the mappings, table, or anything else you desire.

See, http://www.eclipse.org/eclipselink/api/2.1/org/eclipse/persistence/descriptors/ClassDescriptor.html

James
Thanks. It worked, but getFields() return a Vector that is deprecated. So I'll use Bozho suggestion.
Bob Rivers
Vector is not deprecated... but use List its interface, (List)getFields()
James