【问题标题】:Entity Manager returning null for joined columns实体管理器为连接列返回 null
【发布时间】:2013-02-18 09:35:34
【问题描述】:

我有三个表,一个主表 MAIN_TB 与表 TCHARS 和 TSTATUSES 的外键,当我坚持 MAIN_TB 时,重新查询并显示保存的记录,连接的列(来自 TCHARS 的 tchars 和来自 TSTATUSES 的 t_status)为空但数据被保存。我能错过什么?

表 MAIN_TB

@JoinColumn(name = "T_STATUS", referencedColumnName = "T_STATUS")
@ManyToOne
private Tstatuses tStatus;

@JoinColumn(name = "T_CHAR", referencedColumnName = "T_CHAR")
@ManyToOne
private Tchars tChar;

表 TCHARS

@OneToMany(mappedBy = "tChar")
private Collection<MainTb> mainTbCollection;

表 TSTATUSES

@OneToMany(mappedBy = "tStatus")
private Collection<MainTb> mainTbCollection;

代码

 public void saveMainTb(){
     MainTb mainTb = new MainTb();
     Tchars tchars = new Tchars();
     Tstatuses tstatuses = new Tstatuses();

     tchars.setTChar(new Short("1"));
     mainTb.setTChar(tchars);

     tstatuses.setTStatus(new Short("1"));
     mainTb.setTStatus(tstatuses);

     mainTb.setTName("test");
     em.persist(mainTb);

 }

结果

 ![Result][1]

任何帮助将不胜感激

【问题讨论】:

  • 共享查询,你曾经用来重新查询你的持久化对象。

标签: java jpa entitymanager


【解决方案1】:

因为在拥有方或反向方都没有指定级联。我认为您可以尝试以下代码来手动保存所有实体实例:

em.persist(tchars);
em.persist(tstatuses);
mainTb.setTChar(tchars);
mainTb.setTStatus(tstatuses);
em.persist(mainTb);

【讨论】:

  • 改变但没有运气,em.merge(tchars); em.merge(tstatuses); mainTb.setTChar(tchars); mainTb.setTStatus(tstatuses); em.merge(mainTb); 任何其他线索
  • 我刚刚注意到,如果 MAIN_TB 表在部署应用程序时有数据,则显示字段,但如果数据库中的表为空,则字段不会display ,这是 testApp 的link。在 Netbeans 和 Oracle XE 数据库上完成。
【解决方案2】:

您可以将以下代码添加到您的 tStatustChar

fetch=FetchType.EAGER

如果您不需要获取上述 2 个对象,这将影响性能。

相反,您可以在查询中添加 fetch 子句,以获取两个子对象(tStatustChar)以及您的 mainTb 对象.这将为您省去麻烦并获取您在fetch 子句中指定的所有子对象。性能优化器。

【讨论】:

  • 将我的代码更改为 @OneToMany(mappedBy = "tStatus",fetch= FetchType.EAGER) private Collection mainTbCollection;和 @OneToMany(mappedBy = "tChar",fetch= FetchType.EAGER) 私有集合 mainTbCollection;仍然没有运气。
  • 我的重新查询代码是 findAll NamedQuery 即'@NamedQuery(name = "Tchars.findAll", query = "SELECT t FROM Tchars t")',然后我在边界类中调用它(EJB 无状态)..public List&lt;MainTb&gt; populateMyList(){ List&lt;MainTb&gt; mlist = em.createNamedQuery("MainTb.findAll").getResultList(); return mlist; } 然后将边界类注入我的托管 bean(Session Scoped)。
  • 我刚刚注意到,如果 MAIN_TB 表在部署应用程序时有数据,则显示字段,但如果数据库中的表为空,则字段不会display ,这是 testApp 的link。在 Netbeans 和 Oracle XE 数据库上完成。
猜你喜欢
  • 2011-12-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-22
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多