JPA双向OneToMany没有给我想要的收藏品

时间:2015-01-07 21:14:50

标签: oracle jpa eclipselink

我试图用JPA实体映射oracle db模型(使用eclipselink) - 我有以下简单的设置:

具有主键ID的表程序 表multi_kupon与复合主键id,spil和外键program_id

当我尝试通过简单的选择来获取程序时,我希望得到一个列表 multi_kup的但是我得到了一个大小为0的列表。我已经确定当我做的时候 带有连接的select我从program和multi_kupon获取数据。

我相信它与我的两个实体的关系有关 - 希望有人可以指出我的错误

来自实体'程序'的片段:

@Entity
@Table(name = "PROGRAM", schema = "", catalog = "")
public class Program implements Serializable{

  @Id
  private Integer id;

  private List<MultiKupon> MultiKuponList;

  @OneToMany(mappedBy = "program", fetch =  FetchType.EAGER)
  @JoinColumns({@JoinColumn(name = "id", referencedColumnName = "id"),
  @JoinColumn(name = "spil", referencedColumnName = "spil")})
  public List<MultiKupon> getMultiKuponList() {
    return multiKuponList;
  }

来自实体&#39; MultiKupon&#39;的片段:

@Entity
@Table(name = "MULTI_KUPON", schema = "", catalog = "")
public class MultiKupon implements Serializable {

  private Integer id;
  private String spil;

  private Program program;

  @ManyToOne
  public Program getProgram() {
    return program;
  }

我的无状态豆:

@Stateless
public class PostSessionBean {

  public Program getProgramById(int programId) {

String programById = "select p from Program p where p.id = :id";
Program program = null;
try {
  Query query = em.createQuery(programById);
  query.setParameter("id", programId);
  program = (Program) query.getSingleResult();

我确实得到了带有数据的correcct程序实体,但是列表中有 multi_kupon数据大小为0

我在这做错了什么?

2 个答案:

答案 0 :(得分:1)

映射不正确,因为您已指定OneToMany是mappedBy =&#34; program&#34;它应该使用连接列。只应该使用其中一个,因为有一个程序&#39;映射,我建议你使用:

@OneToMany(mappedBy =&#34; program&#34;,fetch = FetchType.EAGER)   public List getMultiKuponList()

然后在MultiKupon的ManyToOne映射上定义连接列,以定义哪些字段应该用于Program表的外键。

由于您已将此作为双向关系,因此您还必须保持关系的双方。这意味着每次添加MultiKupon并希望它与程序关联时,您必须让它引用程序,并将实例添加到Program的集合中。如果不这样做,您将遇到这种情况,其中缓存的程序与数据库中的程序不同步。

一般来说,保持双方同步要便宜得多,但如果这不是一个选项,你可以通过调用em.refresh(程序)来纠正问题(或者只是验证这种情况)。如果映射设置正确,则实例及其列表将重新填充数据库中的内容。

答案 1 :(得分:0)

根据http://sysout.be/2011/03/09/why-you-should-never-use-getsingleresult-in-jpa/

尝试检索List的第一个程序对象:

List<Program> pList = query.getResultList();
if(!pList.isEmpty()){
   return pList.get(0);
}