Посмотрите, работает ли нижеприведенная программа аналогично тому, что у вас на уме. Обратите внимание, как я использовал флаг found
для построения логики.
(Я использовал «_» вместо символа табуляции, потому что он более виден в поле со списком.)
Здесь я предположил, что «цена» в поле со списком не единица цена. Это цена полного количества в этом поле со списком.
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.BorderLayout;
import java.awt.event.*;
public class AddToTable {
public static void main(String[] args) {
JTable jTable = new JTable(new DefaultTableModel(
new Object[][] {},
new String[] {"Item", "Qty", "Price", "ID"}));
JComboBox<String> jComboBox = new JComboBox<>();
jComboBox.addItem("Item1 _ 2 _ 2.5 _ 101");
jComboBox.addItem("Item2 _ 5 _ 6 _ 201");
jComboBox.addItem("Item3 _ 3 _ 1.5 _ 301");
jComboBox.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
Object items = jComboBox.getSelectedItem();
String name = (String) items;
String[] part = name.split(" _ ");
String item = (part[0]);
Integer qty = Integer.valueOf((part[1]));
Double price = Double.parseDouble((part[2]));
Integer ids = Integer.valueOf(part[3]);
DefaultTableModel df = (DefaultTableModel) jTable.getModel();
int rows = df.getRowCount();
boolean found = false;
for (int i = 0; i < rows; i++) {
if (ids.equals(jTable.getValueAt(i, 3))) {
Integer newQty = qty + (Integer) jTable.getValueAt(i, 1);
Double newPrice = price + (Double) jTable.getValueAt(i, 2);
jTable.setValueAt(newQty, i, 1);
jTable.setValueAt(newPrice , i, 2);
found = true;
break;
}
}
if (!found) {
df.addRow(new Object[]{item, qty, price, ids});
}
}
});
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(jComboBox, BorderLayout.NORTH);
f.getContentPane().add(new JScrollPane(jTable), BorderLayout.CENTER);
f.setBounds(300, 200, 400, 300);
f.setVisible(true);
}
}
Если аннотация таблицы отсутствует (и нет ORM.xml), то в JPA имя таблицы формируется на основе имени класса (см. Спецификацию JPA) . Следовательно, почему именно вам нужен метод доступа?
См. http://www.datanucleus.org/products/accessplatform_2_0/jpa/orm/datastore_identifiers.html
Мой коллега нашел следующее решение для среды Spring Data JPA при поддержке Hibernate :
import org.hibernate.internal.SessionImpl;
import org.hibernate.persister.entity.AbstractEntityPersister;
import org.hibernate.persister.entity.EntityPersister;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.EntityManager;
@Service
public class EntityClassToTableNameMapper {
@Transactional
public String[] getTableNames(EntityManager em, Class entityClass) {
Object entityExample;
try {
entityExample = entityClass.newInstance();
} catch (ReflectiveOperationException e) {
throw new RuntimeException(e);
}
SessionImpl session = em.unwrap(SessionImpl.class);
EntityPersister persister = session.getEntityPersister(null, entityExample);
if (persister instanceof AbstractEntityPersister) {
AbstractEntityPersister persisterImpl = (AbstractEntityPersister) persister;
String tableName = persisterImpl.getTableName();
String rootTableName = persisterImpl.getRootTableName();
return new String[] {rootTableName, tableName};
} else {
throw new RuntimeException("Unexpected persister type; a subtype of AbstractEntityPersister expected.");
}
}
}
Обращение к метамодели лежащего в основе ORM является наиболее надежным: недостаточно посмотреть на наличие @Table, его можно не только переопределить конфигурацией XML (например, orm.xml), но и с помощью стратегии JOINED @Table может быть в суперклассе.
Если вы используете аннотацию @Table, проблем нет, как вы показали. Если вы не используете эту аннотацию, имя таблицы совпадает с именем класса (по умолчанию JPA).
Самое интересное начинается, если вы используете файл сопоставления, вам нужно его проанализировать и получить имя таблицы - это не очень сложно, но требует некоторой работы. Если вы боитесь проблем с производительностью, вы можете один раз проанализировать файл (ы) сопоставления и кэшировать все имена таблиц.