0

学生.java

package Model;


import java.util.Set;

public class Student {
private int studentID;
private  String name;
private String city;
private Set<Address> AddressList;
private Set<Contact> ContactList;

public Set<Contact> getContactList() {
    return ContactList;
}

public void setContactList(Set<Contact> contactList) {
    ContactList = contactList;
}

public Set<Address> getAddressList() {
    return AddressList;
}

public void setAddressList(Set<Address> addressList) {
    AddressList = addressList;
}

public int getStudentID() {
    return studentID;
}

public void setStudentID(int studentID) {
    this.studentID = studentID;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getCity() {
    return city;
}

public void setCity(String city) {
    this.city = city;
}

}

アドレス.java

package Model;

public class Address {

private int Aid;
private String fullAddress;
//private Student student;
/*public Student getStudent() {
    return student;
}
public void setStudent(Student student) {
    this.student = student;
}*/
public int getAid() {
    return Aid;
}
public void setAid(int aid) {
    Aid = aid;
}
public String getFullAddress() {
    return fullAddress;
}
public void setFullAddress(String fullAddress) {
    this.fullAddress = fullAddress;
}
}

Contact.java

package Model;

public class Contact {
private int contactId;
private String mobileNo;

public int getContactId() {
    return contactId;
}
public void setContactId(int contactId) {
    this.contactId = contactId;
}
public String getMobileNo() {
    return mobileNo;
}
public void setMobileNo(String mobileNo) {
    this.mobileNo = mobileNo;
}



 }

Student.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Model.Student" table="Student">
    <id name="studentID" type="int">
        <column name="StudentID" />
        <generator class="identity" />
    </id>
    <property name="name" type="java.lang.String"/>
    <property name="city" type="java.lang.String"/>
    <set name="AddressList">
        <key column="studentID"/>
        <one-to-many class="Model.Address"/>        
    </set>
    <set name="ContactList">
        <key column="studentID"/>
        <one-to-many class="Model.Contact"/>        
    </set>
</class>

Address.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Model.Address" table="Address">
    <id name="Aid" type="int">
        <column name="Aid" />
        <generator class="identity" />
    </id>
    <property name="fullAddress" type="java.lang.String"/>
</class>

Contact.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Model.Contact" table="Contact">
    <id name="contactId" type="int">
        <column name="contactId" />
        <generator class="identity" />
    </id>
    <property name="mobileNo" type="java.lang.String"/>
</class>

主な方法。

public static void main(String[] args)
{
    Configuration cfg=new Configuration();
    cfg.configure("hibernate.cfg.xml");
    SchemaExport se=new SchemaExport(cfg);
    se.setOutputFile("D:\\abc.sql");
    se.create(true,true);//create(boolean script, boolean export) 

    System.out.println("------------------Saving of Student--------------------");
    Student student =new Student();
    student.setName("Yograj");
    student.setCity("Nanded");
    Set<Address> addressList=new HashSet<Address>();
    Address address=new Address();
    address.setFullAddress("Chikhali Nanded");
    addressList.add(address);
    address=null;
    address=new Address();
    address.setFullAddress("karvenagar Pune");
    addressList.add(address);
    student.setAddressList(addressList);

    Set<Contact> contactList=new HashSet<Contact>();
    Contact contact=new Contact();
    contact.setMobileNo("9403330577");
    contactList.add(contact);
    contact=null;
    contact=new Contact();
    contact.setMobileNo("9890864805");
    contactList.add(contact);
    student.setContactList(contactList);

    boolean result=new StudentServices().SaveStudent(student);

    if(result)
    {
        System.out.println("------------------Save Student succ..--------------------");
    }
    else
    {
        System.out.println("------------------Saving failed--------------------");
    }

    System.out.println("------------------Student Details--------------------");
    List<Student> studentList=new StudentServices().GetStudentlist();
    for (Student stud : studentList) {
        System.out.println("Name:"+stud.getName());
        System.out.println("City:"+stud.getCity());
        for (Address add : stud.getAddressList()) {
            System.out.println("Full Address:"+add.getFullAddress());
        }
        for (Contact cont : stud.getContactList()) {
            System.out.println("Full Address:"+cont.getMobileNo());
        }
    }
    System.out.println("Execution over.");


}

StudentService.Java

package Service;

import java.util.List;

import javassist.runtime.Inner;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Restrictions;
import org.hibernate.sql.JoinType;

import Model.Address;
import Model.Contact;
import Model.Student;

public class StudentServices {
public boolean SaveStudent(Student student) {
    try {
        Configuration cfg = new Configuration().configure();
        SessionFactory sf = cfg.buildSessionFactory();
        Session session = sf.openSession();
        Transaction transaction = session.beginTransaction();

        session.save(student);
        for (Address add : student.getAddressList()) {
            session.save(add);

        }
        for (Contact cont : student.getContactList()) {
            session.save(cont);

        }
        transaction.commit();
        session.close();
        return true;
    } catch (HibernateException e) {
        return false;
    }
}

public List<Student> GetStudentlist() {
    try {
        Configuration cfg = new Configuration().configure();
        SessionFactory sf = cfg.buildSessionFactory();
        Session session = sf.openSession();
        Transaction transaction = session.beginTransaction();
        Criteria criteria = session.createCriteria(Student.class, "Student")
                .createAlias("Student.AddressList", "Address",JoinType.INNER_JOIN)
                .createAlias("Student.ContactList", "Contact",JoinType.INNER_JOIN);
        List<Student> studentList = criteria.list();

        transaction.commit();
        session.close();
        return studentList;
    } catch (HibernateException e) {
        return null;
    }
}
}

メインメソッドを実行すると、hibernate はデータベースとテーブルを作成します。すべてのテーブルにレコードが保存されますが、基準 API を使用してレコードをフェッチすると、「org.hibernate.LazyInitializationException.」というエラーが表示されます。

4

3 に答える 3

1

あなたの場合student.addressListstudent.contactList遅延読み込みを使用してください。遅延読み込みとは、値がstudentListと一緒に読み込まれるのではなく、とでアクセスした場合にのみ読み込まれることを意味しgetAddressList()ますgetContactList

遅延読み込みは、セッションがまだ開いている間のみ機能します。例のように、セッションを閉じた後にまだロードされていないコンポーネントにアクセスすると、LazyInitializationExceptionがスローされます。

あなたがしていることは:

  1. GetStudentlistで:セッションを開きます
  2. GetStudentlistで:すべての学生をロードします
  3. GetStudentlistの場合:セッションを閉じます
  4. 主に:各学生のために
  5. 主に:経由でアドレスリストにアクセスしますstudent.getAddressList()

これは、ステップ5で例外をスローします。これは、遅延読み込みに適用されるアドレスリストにアクセスし、ステップ3でセッションが既に閉じられているため、データをこれ以上読み込むことができないためです。

getAddressList()とを呼び出した後にセッションを閉じる必要がありますgetContactList()。そうすれば機能します。

ちなみに、GetStudentlistのようにデータを読み取るだけの場合は、トランザクションを開始する必要はなく、何もコミットする必要はありません。

于 2013-01-23T13:54:23.400 に答える
0

プロキシを初期化するために学生のメソッドにアクセスしてみてください。

プロキシを初期化するために、サービス メソッドで student.getAddress().getFullAddress() を呼び出してみてください。

このようにして、遅延初期化例外を回避します。

もう 1 つの方法は、eager fetching を true に設定することですが、最初の方法を最初に使用したいと思います。

于 2013-01-23T12:28:24.260 に答える