2016-08-12 73 views
3

我有一个学生实体。我的想法是收集ArrayList中的多个学生对象,并将该列表中的所有对象保存到数据库中。你什么时候使用@ElementCollection注解?它适用于这样的情况吗?如何在Hibernate中通过ArrayList保存多个对象?

学生

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) 

回答

8

你必须做这样的事情:

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

如果你想保存实体,你应该映射它。 ArrayList <>未映射实体。学生有映射,所以你应该单独保存。

+0

我现在明白了。谢谢! –

相关问题