我有一个大型数据集,我正在批量导入行,看起来像
(news_id, category_id_1, category_id_2, ..., category_id_9)
每个category_id_x
是一组固定类别的整数。
我想将这些多个类别映射到m2m关系,以便更快地进行搜索。
我有一个News
表和一个Category
表。
Category
表将类别ID映射到类别名称。
我已经在JPA中为各种News
字段设置了所有映射,我想重用此代码。
我的问题是如何在JPA中导入这些m2m关系。
我正在思考以下内容,但我发现错误,说你无法手动创建类别对象。
// 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
编辑:
似乎我正在处理分离实体的概念。这是使用unsaved-value映射或isSaved属性在Hibernate中解决的。现在在JPA中寻找解决方案。
答案 0 :(得分:0)
我只看到1个方向的关联。也许你忘了做另一个,比如: reportType0.add(新闻); reportType1.add(新闻); ... reportTypeN.add(新闻);
此外,您正在“创建”ReportType的实例,而不是从数据库中收集它们。它们是否已存在于数据库中?