簡體   English   中英

如何在hibernate中通過ArrayList保存多個對象?

[英]How to save multiple objects via ArrayList in hibernate?

我有一個學生實體。 我的想法是在 ArrayList 中收集多個學生對象,並將該列表中的所有對象保存到數據庫中。 什么時候使用@ElementCollection 注解? 它適用於這樣的情況嗎?

學生

package basic;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String name;

    public Student() {

    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Student [id=" + id + ", name=" + name + "]";
    }

    public Student(String name) {
        this.name = name;
    }

}

亞軍

package basic;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class Runner {

    public static void main(String[] args) {

        SessionFactory sessionFactory = new Configuration().configure("/basic/hibernate.cfg.xml").buildSessionFactory();
        Session session = sessionFactory.openSession();
        session.beginTransaction();

        List<Student> students = new ArrayList<>();

        students.add(new Student("Michael"));
        students.add(new Student("Dave"));
        students.add(new Student("Tom"));
        students.add(new Student("Dinesh"));
        students.add(new Student("Lakshman"));
        students.add(new Student("Cruise"));

        session.save(students);

        session.getTransaction().commit();
        session.close();
    }

}

錯誤

Exception in thread "main" org.hibernate.MappingException: Unknown entity: java.util.ArrayList
    at org.hibernate.metamodel.internal.MetamodelImpl.entityPersister(MetamodelImpl.java:620)
    at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1596)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:104)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192)
    at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177)
    at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73)
    at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:668)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:660)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:655)
    at basic.Runner.main(Runner.java:27)

你必須做這樣的事情:

for(Student student : students) {
    session.save(student);
}

如果要保存實體,則應映射它。 ArrayList <>不是映射實體。 學生有映射,所以你應該單獨保存。

@ElementCollection你應該用來定義對象之間的關系 - 這里你有很好的explenation https://en.wikibooks.org/wiki/Java_Persistence/ElementCollection

要保存對象列表,需要按對象進行迭代,如下所示 - > 如何使用hibernate將多行插入數據庫?

我們可以一次存儲對象數組而不是使用循環的任何函數。 這會導致性能問題..

我會進一步建議使用另一個 Hibernate 命令來避免Out Of Memory錯誤...

SessionFactory sessionFactory = config.buildSessionFactory();
    Session session = sessionFactory.openSession();
     
    Transaction transaction = session.beginTransaction();
     
    for (int i = 0 ; i < students.size(); i++) {
         session.save(students.get(i));
         
        if (i % 100 == 0) {//a batch size for safety
            session.flush();
            session.clear();
        }
    }
     
    transaction.commit();
    session.close();
    sessionFactory.close();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM