Создайте отношение JPA «многие ко многим», используя идентификатор вместо объекта - PullRequest
1 голос
/ 13 мая 2011

У меня большой набор данных, который я импортирую оптом, строки выглядят как

(news_id, category_id_1, category_id_2, ..., category_id_9)

Каждый category_id_x является целым числом из фиксированного набора категорий.

Я хочуотобразите эти несколько категорий в отношение m2m для более быстрого поиска.

У меня есть таблица News и таблица Category.

Таблица Category отображает идентификаторы категорий на имена категорий.

У меня уже есть все настройки сопоставления в JPA для различных полей News, и я хочу повторно использовать этот код.

У меня вопрос, как я могу импортировать эти отношения m2m в JPA.

Я размышлял в следующем, но я получаю сообщения о том, что вы не можете создавать объекты категории вручную.

// News object
@Entity
@Table(name = "news", schema = "public", uniqueConstraints = {})
public class News implements java.io.Serializable {

    // Fields
    @Column(name = "asx_code")
    private String asxCode;
    @Id
    @Column(name = "annnum", unique = true, nullable = false)
    private String annnum;
    @Column(name = "company_name")
    private String companyName;
    ...
    ...
    @ManyToMany() 
    @JoinTable(name="announcement_types", 
        joinColumns= @JoinColumn(name="annnum"),
        inverseJoinColumns=@JoinColumn(name="report_type"))
    private Collection<ReportType> reportType;

function m(String) {
    // extract and return data from datasource
}

// Create a news object from 9 different report types
News o = new News();        
java.util.Collection<ReportType> types = new HashSet(); 
types.add(new ReportType(toInt(m("RepType0"))));
types.add(new ReportType(toInt(m("RepType1"))));
types.add(new ReportType(toInt(m("RepType2"))));
types.add(new ReportType(toInt(m("RepType3"))));
types.add(new ReportType(toInt(m("RepType4"))));
types.add(new ReportType(toInt(m("RepType5"))));
types.add(new ReportType(toInt(m("RepType6"))));
types.add(new ReportType(toInt(m("RepType7"))));
types.add(new ReportType(toInt(m("RepType8"))));
types.add(new ReportType(toInt(m("RepType9"))));
o.setReportType(types);

// Query
try {
    EntityTransaction entr = em.getTransaction();
    entr.begin();           
    em.persist(row); # row is our News object
    entr.commit();
} catch (Exception e) {
    e.printStackTrace();
    return false;
}
return true;

// ERROR
SEVERE: Could not synchronize database state with session
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: edu.unsw.eventstudy.shared.dto.ReportType

РЕДАКТИРОВАТЬ:

Кажется, я имею дело с понятием отдельных сущностей.Это решается в Hibernate с помощью сопоставления unsaved-value или свойства isSaved.Сейчас ищем решение в JPA.

1 Ответ

0 голосов
/ 14 мая 2011

Я вижу ассоциацию только в 1 направлении. Может быть, вы забыли сделать другой, например: reportType0.add (новости); reportType1.add (новости); ... reportTypeN.add (новости);

Кроме того, вы «создаете» экземпляры ReportType вместо того, чтобы собирать их из базы данных. Они уже существуют в базе данных?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...