2010-09-07 57 views
2

我想更新我在Java中的知识,因为我上次在1.4.X版本中使用它时...我试图使用1.6.0,特别是Java持久性API(2.0)。JPA/EclipseLink - 检索列名

我设法创建了一个实体类。它工作,因为我能够存储和检索数据。

但我打打闹闹,当我决定来填充表的列名的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,

鲍勃

回答

9

可以解析列注释:

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

注意, Column注释是可选的,所以你必须确保你有它的定义。如果没有,你将不得不咨询名字翻译机制,这对于这个太过分了。

+2

列注释是可选的 – unbeli 2010-09-07 18:30:23

+0

我知道它是。但在他的情况下,它不是。我会添加一个关于它的注释。 – Bozho 2010-09-07 18:32:29

+0

'Class#isAnnotationPresent'方法是检查注释是否存在的更好方法。 – Lii 2014-08-29 09:47:59

1

但我打打闹闹,当我决定来填充表的列名的JList并没有得到成功......

好,同时可以解析注解(正如Bozho所指出的那样),JPA的全部意义在于从业务对象中抽象出表和列的名称(甚至可以使用默认值,使得信息甚至不存在)。换句话说,我不会依赖它们,而是使用类名称和属性名称。

+0

获得一个字段我真的希望在JPA 2.0中的元数据API将有东西提供,但据我了解,它不包括列信息。 – Bozho 2010-09-07 12:07:59

+0

正确,元数据API不包含列信息。 – James 2010-09-07 14:06:00

9

在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

+0

谢谢。它工作,但getFields()返回一个弃用的向量。所以我会使用Bozho的建议。 – 2010-09-07 20:07:01

+0

向量不被弃用...但使用列出其接口,(List)getFields() – James 2010-09-08 13:05:02

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