Как получить название таблицы отображения объекта в JPA во времени выполнения?

Посмотрите, работает ли нижеприведенная программа аналогично тому, что у вас на уме. Обратите внимание, как я использовал флаг 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);
  }
}
28
задан Brian Tompsett - 汤莱恩 13 May 2017 в 12:03
поделиться

4 ответа

Если аннотация таблицы отсутствует (и нет ORM.xml), то в JPA имя таблицы формируется на основе имени класса (см. Спецификацию JPA) . Следовательно, почему именно вам нужен метод доступа?

См. http://www.datanucleus.org/products/accessplatform_2_0/jpa/orm/datastore_identifiers.html

4
ответ дан 28 November 2019 в 03:53
поделиться

Мой коллега нашел следующее решение для среды 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.");
        }
    }
}
2
ответ дан Karmakulov Kirill 28 November 2019 в 03:53
поделиться

Обращение к метамодели лежащего в основе ORM является наиболее надежным: недостаточно посмотреть на наличие @Table, его можно не только переопределить конфигурацией XML (например, orm.xml), но и с помощью стратегии JOINED @Table может быть в суперклассе.

0
ответ дан p3consulting 28 November 2019 в 03:53
поделиться

Если вы используете аннотацию @Table, проблем нет, как вы показали. Если вы не используете эту аннотацию, имя таблицы совпадает с именем класса (по умолчанию JPA).

Самое интересное начинается, если вы используете файл сопоставления, вам нужно его проанализировать и получить имя таблицы - это не очень сложно, но требует некоторой работы. Если вы боитесь проблем с производительностью, вы можете один раз проанализировать файл (ы) сопоставления и кэшировать все имена таблиц.

1
ответ дан 28 November 2019 в 03:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: