实体管理器为已连接的列返回null

时间:2013-02-18 09:35:35

标签: java jpa entitymanager

我有三个表,一个主表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]

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您可以将以下代码添加到 tStatus tChar

fetch=FetchType.EAGER

如果您不需要总是获取上述2个对象,这将达到性能。

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