我正在尝试更新我的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,
鲍勃
答案 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的重点在于以某种方式从业务对象中抽象表名和列名(甚至可以使用默认值,使信息甚至不存在) 。换句话说,我不会依赖它们而是使用类名和属性名。