Гибернация отношения @OneToMany


Я начал играть вокруг с Hibernate со вчерашнего дня и придумал следующий пример один-ко-многим пример отношения, но я не уверен, если я делаю правильно и у меня никто из моего окружения не зная гибернации. Пожалуйста, взять быстрый взгляд на него, то может и ничего плохого.

Моя цель-использовать один-ко-многим отношения с аннотациями для выполнения основных Insert и Update.

Классы сущностей из здесь.

Студент

@Entity
@Table(name = "STUDENT")
public class Student {

    private long studentId;
    private String studentName;
    private Set<Phone> studentPhoneNumbers = new HashSet<Phone>(0);

    public Student() {
    }

    public Student(String studentName, Set<Phone> studentPhoneNumbers) {
        this.studentName = studentName;
        this.studentPhoneNumbers = studentPhoneNumbers;
    }

    @Id
    @GeneratedValue
    @Column(name = "STUDENT_ID")
    public long getStudentId() {
        return this.studentId;
    }

    public void setStudentId(long studentId) {
        this.studentId = studentId;
    }

    @Column(name = "STUDENT_NAME", nullable = false, length = 100)
    public String getStudentName() {
        return this.studentName;
    }

    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }

    @OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "STUDENT_PHONE", joinColumns = { @JoinColumn(name = "STUDENT_ID") }, inverseJoinColumns = { @JoinColumn(name = "PHONE_ID") })
    public Set<Phone> getStudentPhoneNumbers() {
        return this.studentPhoneNumbers;
    }

    public void setStudentPhoneNumbers(Set<Phone> studentPhoneNumbers) {
        this.studentPhoneNumbers = studentPhoneNumbers;
    }
//I added in this method for updating
    public void addPhone(Phone phone) {
        this.studentPhoneNumbers.add(phone);
    }

}

Телефон

@Entity
@Table(name = "PHONE")
public class Phone {

    private long phoneId;
    private String phoneType;
    private String phoneNumber;

    public Phone() {
    }

    public Phone(String phoneType, String phoneNumber) {
        this.phoneType = phoneType;
        this.phoneNumber = phoneNumber;
    }

    @Id
    @GeneratedValue
    @Column(name = "PHONE_ID")
    public long getPhoneId() {
        return this.phoneId;
    }

    public void setPhoneId(long phoneId) {
        this.phoneId = phoneId;
    }

    @Column(name = "PHONE_TYPE", nullable = false, length=10)
    public String getPhoneType() {
        return this.phoneType;
    }

    public void setPhoneType(String phoneType) {
        this.phoneType = phoneType;
    }

    @Column(name = "PHONE_NUMBER", nullable = false, length=15)
    public String getPhoneNumber() {
        return this.phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

}

CreateMain: создать запись в студента, STUDENT_PHONE и телефонные столики

public class CreateMain {
    public static void main(String[] args) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();

            Set<Phone> phoneNumbers = new HashSet<Phone>();
            phoneNumbers.add(new Phone("house", "32354353"));
            phoneNumbers.add(new Phone("mobile", "9889343423"));

            Student student = new Student("Eswar", phoneNumbers);
            session.save(student);

            transaction.commit();
        } catch (HibernateException e) {
            transaction.rollback();
            e.printStackTrace();
        } finally {
            session.close();
        }
    }
}

UpdateMain: вставьте новый телефон запись для записи, созданные в CreateMain

public class UpdateMain {
    public static void main(String[] args) {
        String testupd = "Eswar";
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();            
            Query queryResult =  session.createQuery("from Student");  
            List allStudents =  queryResult.list();  
            for (int i = 0; i < allStudents.size(); i++) {  
                    Student student = (Student) allStudents.get(i);  
                    if(student.getStudentName().compareTo(testupd)==0) {
                        student.addPhone(new Phone("test","12345678"));
                        session.update(student); 
                    }
            }  
            session.getTransaction().commit(); 
        } catch (HibernateException e) {
            transaction.rollback();
            e.printStackTrace();
        } finally {
            session.close();
        }
    }
}

DeleteMain: удалить запись

public class UpdateMain {

    public static void main(String[] args) {
        String testupd = "Eswar";
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();            
            Query queryResult =  session.createQuery("from Student");  
            List allStudents =  queryResult.list();  
            for (int i = 0; i < allStudents.size(); i++) {  
                    Student student = (Student) allStudents.get(i);  
                    if(student.getStudentName().compareTo(testupd)==0) {
                        student.addPhone(new Phone("test","12345678"));
                        session.update(student); 
                    }
            }  
            session.getTransaction().commit(); 
        } catch (HibernateException e) {
            transaction.rollback();
            e.printStackTrace();
        } finally {
            session.close();
        }

    }

}


315
5
задан 5 июля 2011 в 01:07 Источник Поделиться
Комментарии
1 ответ

Только 3 небольшие замечания, потому что это действительно уже выглядит хорошо.


  • Требуется наладчики идентификатор, чтобы быть частным. Они создаются
    значения по Hibernate и другие классы не связывайтесь с ними.

  • Также по умолчанию конструкторы студент и телефоны, режим гибернации
    нужен только пакет по умолчанию видимость. Так что лучше, чтобы удалить общественности
    модификаторы доступа в конструкторы по умолчанию.

  • Я бы также создать StudentDao класса вместо 3 *основные классы. И если вы хотите, вы можете использовать Spring аннотации сделки, чтобы уменьшить шаблонный код транзакции.

4
ответ дан 29 ноября 2013 в 07:11 Источник Поделиться