使用JPA映射的非主键字段?

时间:2010-08-30 05:23:35

标签: java hibernate orm jpa

我正在努力解决这个问题,我想知道我所做的事情是否有意义?

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中是否有意义。

1 个答案:

答案 0 :(得分:0)

  

OneToMany是“Part”类的双向。我认为这很难解释(:

TestSamplePart之间的一对多关联双向,mappedBy不正确(application拥有该关系,它甚至不知道test_sample),您的映射没有意义。有些事情需要改变。

我认为您应该显示期望的表是什么,而不是生成的表(因为映射是不连贯的,生成的结果不能令人满意)。你在谈论妥协,所以我相信你已经知道预期结果应该是什么。请出示。