我是hibernate的新手。使用它创建一个小应用程序时,出现以下异常:
线程“主”中的异常java.lang.IllegalArgumentException:未知实体: model.Students在org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:223)在controller.Main.main(Main.java:50)
有人可以帮我吗?
实体类如下:
Other details: NetBeans Version: 6.7.1 Hibernate : 3.2.5
实体学生
package model; import java.io.Serializable; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToOne; @Entity public class Students implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; @OneToOne(cascade=CascadeType.ALL) private Address address; public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } }
另一个实体类
package model; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Entity public class Address implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String city; private String zip; public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getZip() { return zip; } public void setZip(String zip) { this.zip = zip; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } }
DAO文件
package controller; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; import model.Address; import model.Students; import org.hibernate.HibernateException; public class Main { public static void main(String arr[]) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("OneToOne2PU"); EntityManager em = emf.createEntityManager(); EntityTransaction tr= em.getTransaction(); try{ tr.begin(); Address add1 = new Address(); add1.setCity("pune"); add1.setZip("09"); Address add2 = new Address(); add2.setCity("mumbai"); add2.setZip("12"); Students s1 = new Students(); s1.setName("abc"); s1.setAddress(add1); Students s2 = new Students(); s2.setName("xyz"); s2.setAddress(add2); em.persist(s1); em.persist(s2); tr.commit(); emf.close(); } catch(HibernateException e){ e.printStackTrace(); } } }
persistence.xml
<?xml version="1.0" encoding="UTF-8"?> <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> <persistence-unit name="OneToOnePU" transaction-type="JTA"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <jta-data-source>students</jta-data-source> <exclude-unlisted-classes>false</exclude-unlisted-classes> <properties> <property name="hibernate.hbm2ddl.auto" value="create-tables"/> <property name="hibernate.dialect" value="org.hibernate.dialect.DerbyDialect"/> <property name="hibernate.connection.username" value="app"/> <property name="hibernate.connection.password" value="app"/> <property name="hibernate.connection.url" value="jdbc:derby://localhost:1527/StudentsData"/> </properties> </persistence-unit> </persistence>
hibernate.cfg.xml文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.dialect">org.hibernate.dialect.DerbyDialect</property> <property name="hibernate.connection.driver_class">org.apache.derby.jdbc.ClientDriver</property> <property name="hibernate.connection.url">jdbc:derby://localhost:1527/sample</property> <property name="hibernate.connection.username">app</property> <property name="hibernate.connection.password">app</property> <mapping class="model.Students"/> <mapping class="model.Address"/> </session-factory> </hibernate-configuration>
取决于项目结构,但可能是通过在persistence-unit元素下直接在persistence.xml中添加以下内容。
<class>model.Students</class> <class>model.Address</class>
完全像这样:
<?xml version="1.0" encoding="UTF-8"?> <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> <persistence-unit name="OneToOnePU" transaction-type="JTA"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <jta-data-source>students</jta-data-source> <class>model.Students</class> <class>model.Address</class> <exclude-unlisted-classes>false</exclude-unlisted-classes> <properties> <property name="hibernate.hbm2ddl.auto" value="create-tables"/> <property name="hibernate.dialect" value="org.hibernate.dialect.DerbyDialect"/> <property name="hibernate.connection.username" value="app"/> <property name="hibernate.connection.password" value="app"/> <property name="hibernate.connection.url" value="jdbc:derby://localhost:1527/StudentsData"/> </properties> </persistence-unit> </persistence>
顺便说一句,为什么要在persistence.xml和hibernate.cfg.xml中都配置诸如 hibernate.dialect之类的 属性?