我正在努力解决这个问题,我想知道我所做的事情是否有意义?
public class Application {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="id")
private long id;
....
}
@MappedSuperclass
public abstract class Sample {
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@OneToOne (cascade=CascadeType.ALL)
protected Application application;
....
}
// TestSample contains a list that is mapped not by the primary key of the Sample
public class TestSample extends Sample {
@OneToMany(mappedBy="application", cascade=CascadeType.ALL, fetch=FetchType.LAZY)
private List<Part> parts = new ArrayList<Part>();
....
}
public class Part {
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private long id = 0;
@ManyToOne (cascade=CascadeType.ALL, fetch=FetchType.LAZY)
Application application;
}
我遇到的问题是我能够添加部件,数据库看起来正确,然后当我尝试获取parts
列表时,我得到一个空列表。
如果我通过更改这些类来妥协数据库结构,我可以使它工作:
// TestSample contains a list that is mapped not by the primary key of the Sample
public class TestSample extends Sample {
@OneToMany(mappedBy="testSample", cascade=CascadeType.ALL, fetch=FetchType.LAZY)
private List<Part> parts = new ArrayList<Part>();
....
}
public class Part {
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private long id = 0;
@ManyToOne (cascade=CascadeType.ALL, fetch=FetchType.LAZY)
TestSample testSample;
}
这些表是由hibernate自动生成的,因此它们会像这样出现:
application
id : number
....
test_sample
id : number
application_id : number
...
part
id : number
application_id : number
如果我将其更改为不太理想的方式,则最后一个表格不同:
part
id : number
test_sample_id : number
因为所有情况下的id都是自动生成的,所以没有共享的主键。基本上我要做的是使用mappedby,其中mappedby指的是一个不是名为“TestSample”的表/类的主键的字段。这是我不确定在JPA中是否有意义。
答案 0 :(得分:0)
OneToMany是“Part”类的双向。我认为这很难解释(:
TestSample
与Part
之间的一对多关联不双向,mappedBy
不正确(application
表不拥有该关系,它甚至不知道test_sample
),您的映射没有意义。有些事情需要改变。
我认为您应该显示期望的表是什么,而不是生成的表(因为映射是不连贯的,生成的结果不能令人满意)。你在谈论妥协,所以我相信你已经知道预期结果应该是什么。请出示。