Java 使用Hibernate延迟加载的意外行为

Java 使用Hibernate延迟加载的意外行为,java,hibernate,lazy-loading,Java,Hibernate,Lazy Loading,我试图在查询父表(BeanMetaData)后查看子表(BeanPropertyMetaData)的属性。我无法在控制台上看到子表值的输出。我也没有收到任何异常或错误消息。你能帮我找出哪里出了问题吗。我正在使用Hiberate 3和spring 3。源代码如下: 父类: @Entity @Table(name="BEAN_META_DATA") public class BeanMetaData extends GeneralEntity { private String beanName;

我试图在查询父表(BeanMetaData)后查看子表(BeanPropertyMetaData)的属性。我无法在控制台上看到子表值的输出。我也没有收到任何异常或错误消息。你能帮我找出哪里出了问题吗。我正在使用Hiberate 3和spring 3。源代码如下:

父类:

@Entity 
@Table(name="BEAN_META_DATA")
public class BeanMetaData extends GeneralEntity {

private String beanName;
private String mappedTable;
private String title;
private List<BeanPropertyMetaData> properties;

@Id
@Column(name = "D_PK", nullable = false, precision = 22, scale = 0)
@TableGenerator( name = "appSeqStore", table = "APP_SEQ_STORE", pkColumnName = "APP_SEQ_NAME", pkColumnValue = "BEAN_PK", valueColumnName = "APP_SEQ_VALUE", initialValue = 1, allocationSize = 1 )
@GeneratedValue( strategy = GenerationType.TABLE, generator = "appSeqStore" )
public long getPk() {
    return pk;
}

@Column(name = "BEAN_NAME", nullable = false, length=60)
public String getBeanName() {
    return beanName;
}
public void setBeanName(String beanName) {
    this.beanName = beanName;
}

@Column(name = "TABLENAME", nullable = false, length=60)
public String getMappedTable() {
    return mappedTable;
}
public void setMappedTable(String mappedTable) {
    this.mappedTable = mappedTable;
}

@Column(name = "TITLE", nullable = false, length=60)
public String getTitle() {
    return title;
}
public void setTitle(String title) {
    this.title = title;
}


**@OneToMany(mappedBy="beanName",cascade = { javax.persistence.CascadeType.ALL}, fetch = FetchType.LAZY)
public List<BeanPropertyMetaData> getProperties() {
    return properties;
}**

public void setProperties(List<BeanPropertyMetaData> props) {
    this.properties = props;
} 
}

我在数据库的两个表中都填充了值。我正在运行以下测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring-db-config.xml", "classpath:spring-beans.xml"})
public class BeanServiceTest {

@Autowired 
DatabaseDAO databaseDAO;

@Test
public void getBeanMetaData(){
    String beanName= "com.inspireme.ebeans.Project";
    String query= "from BeanMetaData as metadata where beanName= '"+beanName+"'";
    System.out.println("1");
    SessionFactory sf= databaseDAO.getSessionFactory();
    System.out.println("2");
    //Session session = sf.getCurrentSession();
    Session session = sf.openSession();
    System.out.println("3");
    session.beginTransaction();
    System.out.println("4");
    Query hibQuery= session.createQuery(query);
    System.out.println("5");
    List result= hibQuery.list();
    System.out.println("6");
    BeanMetaData beanData= (BeanMetaData) result.get(0);
    System.out.println("7");
    System.out.println("bean data= "+beanData.getTitle()+", pk= "+beanData.getPk());
    System.out.println("9");
    List<BeanPropertyMetaData> properties= beanData.getProperties();
    System.out.println("10");
    System.out.println("prop size= "+properties.size());
    System.out.println("11");
    for(BeanPropertyMetaData prop: properties){
        System.out.println("prop name= "+prop.getLabel());

    }
    session.close();
    assertTrue(true);
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(位置={“classpath:springdb config.xml”,“classpath:springbeans.xml”})
公共类BeanServiceTest{
@自动连线
数据库dao数据库dao;
@试验
public void getBeanMetaData(){
String beanName=“com.inspireme.ebeans.Project”;
String query=“from BeanMetaData as metadata,其中beanName=”+beanName+“”;
系统输出打印项次(“1”);
SessionFactory sf=databaseDAO.getSessionFactory();
系统输出打印项次(“2”);
//Session Session=sf.getCurrentSession();
Session Session=sf.openSession();
系统输出打印项次(“3”);
session.beginTransaction();
系统输出打印项次(“4”);
Query=session.createQuery(查询);
系统输出打印项次(“5”);
List result=hibQuery.List();
系统输出打印项次(“6”);
BeanMetaData beanData=(BeanMetaData)结果。获取(0);
系统输出打印项次(“7”);
System.out.println(“bean数据=“+beanada.getTitle()+”,pk=“+beanada.getPk());
系统输出打印号(“9”);
List properties=beanada.getProperties();
系统输出打印项次(“10”);
System.out.println(“prop size=“+properties.size());
系统输出打印号(“11”);
对于(BeanPropertyMetaData属性:属性){
System.out.println(“prop name=“+prop.getLabel());
}
session.close();
资产真实(真实);
}
我在控制台上获得以下输出:

0[main]INFO com.inspireme.utils.PropertiesUtil-从类路径资源[database.properties]加载属性文件
1
2
3
4
5
休眠:选择beanmetada0\uU.D\u PK…
6
7
bean data=Project,pk=2
9
10
Hiber冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬冬眠:选择财产0_0.FK.FK.FK.FK.FK.FK.FK.FK.FK.FK.FK.FK.FK.FK的财产作为FK15.FK15.FK15.FK.FK作为FK15作为FK15.FK15.FK15.FK15.FK15.FK15作为FK15.FK15.FK15.2.FK15.2.FK15.FK15.2.2.2.FK15.2.FK15.FK15.FK15.2.2.FK.FK.FK.FK.FK.FK.FK.FK.FK.FK.FK.FK._6_1_,属性0_。数据类型为数据类型6_1_,财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产0.财产.财产.财产.财产.财产.财产.财产名称.财产.财产.财产.财产.财产.财产.财产.财产.财产.财产.财产.财产.财产.财产.财产.财产.财产.财产.名称.名称.名称.名称.财产.名称.名称.名称.财产.财产.名称.财产.名称.财产.名称.财产.名称.名称.财产.名称.财产.名称.财产.名称.财产.名称.名称.财产.财产.名称.名称.财产.名称.名称.名称.财产.名称.名称._u.与14_6_1一样独特吗_Beanproprop1.D_u1.D_1.D_1.D_u是作为D2 6 6_6 0 0 0 0 UUUUU作为D2 6 6_6 6 0 0 0 UUUUUUUUU创建的,Beanproprop1.D_1.D_是作为D3 6_6_1.D_是作为D3 6_是作为D3 6_6_的制造的,BeanProproproproproproproprop1.D_1.D_1.D_1.D_是作为作为作为作为作为D36_1.D_1.D_是作为作为D36 6_1.1.D_UUUUUUUUUUUUUUUU1.1.1.1.1.1.1.1.1.1.D.D是作为作为作为D36 6.1.1.1.1.1.D 1.将长度列表为列表8\u 6\u 0\u,beanproper1_《美国10月6日6月0日,BeanPropropert1.美国10月6日,BeanProproprop1.美国10月6日,BeanProproprop1.美国10月8日,BeanProprop1.美国8月1.美国8月8日,美国8月8日,美国8月6月6日6月6日,BeanPropropropert1.美国8月8月8日,美国10月8月1日,BeanPropropropropropert1.美国8.Colum1.美国8.COLUMN.美国8.Colu.美国8.美国8.COLUMN.美国8.美国列名作为柱。美国国家名称作为柱名称作为柱名称作为柱11月11名作为柱11月6月6月6月6日,BeanPropert0,BeanPropar1,BeanPropert1,BeanProp1,BeanPropert1,BeanPropert1,BeanPropert1.以色列,美国8.1.以色列,美国8.1.一,_在属性0_u.FK_BEAN_PROPERTY=BeanPropert1_u.D_PK上,其中属性0_u.FK_BEAN_META_DATA=


为什么程序不打印列表大小?非常感谢您的帮助。

此时不需要表生成器。

您可以不使用它进行检查吗?我想您需要fetchType急切地做您想做的事情。下面是一个很好的答案,提供了更多详细信息:我刚刚意识到我手动将数据直接添加到数据库中。我将保留som通过Hibernate API插入数据并尝试读取。确定通过在读取之前通过Hibernate插入数据解决了该问题。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring-db-config.xml", "classpath:spring-beans.xml"})
public class BeanServiceTest {

@Autowired 
DatabaseDAO databaseDAO;

@Test
public void getBeanMetaData(){
    String beanName= "com.inspireme.ebeans.Project";
    String query= "from BeanMetaData as metadata where beanName= '"+beanName+"'";
    System.out.println("1");
    SessionFactory sf= databaseDAO.getSessionFactory();
    System.out.println("2");
    //Session session = sf.getCurrentSession();
    Session session = sf.openSession();
    System.out.println("3");
    session.beginTransaction();
    System.out.println("4");
    Query hibQuery= session.createQuery(query);
    System.out.println("5");
    List result= hibQuery.list();
    System.out.println("6");
    BeanMetaData beanData= (BeanMetaData) result.get(0);
    System.out.println("7");
    System.out.println("bean data= "+beanData.getTitle()+", pk= "+beanData.getPk());
    System.out.println("9");
    List<BeanPropertyMetaData> properties= beanData.getProperties();
    System.out.println("10");
    System.out.println("prop size= "+properties.size());
    System.out.println("11");
    for(BeanPropertyMetaData prop: properties){
        System.out.println("prop name= "+prop.getLabel());

    }
    session.close();
    assertTrue(true);
}