JPA / EclipseLink - 检索列名称

时间:2010-09-07 10:52:38

标签: java orm jpa jpa-2.0

我正在尝试更新我的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;

    ...
}

有没有办法检索列名?

我发现了post。似乎是一个有效的解决方案,但我认为它可能有更容易/优雅的东西?我不知道为什么,但我期待已经完成的方法......

TIA,

鲍勃

4 个答案:

答案 0 :(得分:10)

您可以解析列注释:

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

请注意,Column注释是可选的,因此您必须确保已定义它。如果不是,你将不得不咨询名称翻译机制,这对此来说太过分了。

答案 1 :(得分:10)

在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

答案 2 :(得分:2)

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()返回类字段名称及其数据库列字段名称。

答案 3 :(得分:1)

  

但是当我决定用一个表的列名填充JList并且没有成功时,我在愚弄...

好吧,虽然你可以解析注释(正如Bozho所指出的),JPA的重点在于以某种方式从业务对象中抽象表名和列名(甚至可以使用默认值,使信息甚至不存在) 。换句话说,我不会依赖它们而是使用类名和属性名。