У меня большой набор данных, который я импортирую оптом, строки выглядят как
(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.