我试图用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
我在这做错了什么?
答案 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);
}