BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #42033同步于 2015/6/23
Java机器人发帖

关于hibernate的问题

sun111
2015/6/23镜像同步0 回复
LZ最近在学hibernate框架,然后遇到一开始的实体关系映射,现在遇到一个问题,就是在考虑单向的一对多的映射关系时,会出错。这是一个基本的邮件管理的关系,两张表一张是Person表,内容是id和name;另一张是email表,内容是id和email.两个类分别是: package dom; import java.util.ArrayList; import java.util.List; import javax.persistence.*; import dom.*; public class Person2 { private Integer id; private String name; private List<Email> emails = new ArrayList<Email>(); public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Email> getEmails() { return emails; } public void setEmails(List<Email> emails) { this.emails = emails; } } 另一个类是: package dom; import javax.persistence.*; public class Email { private Integer id; private String email; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } } 然后对应的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"> <!-- Generated 2015-6-23 16:53:51 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <class name="dom.Email" table="EMAIL"> <id name="id" type="java.lang.Integer"> <column name="ID" /> <generator class="native" /> </id> <property name="email" type="java.lang.String"> <column name="EMAIL" /> </property> </class> </hibernate-mapping> 和 <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2015-6-23 20:40:14 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <class name="dom.Person2" table="PERSON2"> <id name="id" type="java.lang.Integer"> <column name="ID" /> <generator class="native" /> </id> <property name="name" type="java.lang.String"> <column name="NAME" /> </property> <list name="emails" inverse="false" table="EMAIL" lazy="true" cascade="all"> <key> <column name="ID" /> </key> <list-index></list-index> <one-to-many class="dom.Email" /> </list> </class> </hibernate-mapping> 然后我是用hibernate自带的建表方式来建表的,并且测试代码如下: package Sun; import java.util.List; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import dom.*; public class TestAnnoationedPersonEmail { public static void main(String args[]) throws Exception { Person2 person = new Person2(); person.setName("Jane"); Email email = new Email(); email.setEmail("yahoo@yahoo.com.cn"); person.getEmails().add(email); email = new Email(); email.setEmail("163@163.com"); person.getEmails().add(email); Configuration config = new Configuration().configure(); SessionFactory sf = config.buildSessionFactory(); Session sess = sf.openSession(); Transaction tx = sess.beginTransaction(); //sess.persist(email); sess.persist(person); //sess.save(person); @SuppressWarnings("unchecked") List<Person2> list = sess.createQuery("select p from Person2 p left join fetch p.emails e" + " where e.email like '%@yahoo.com.cn'").list(); for(Person2 p :list) { System.out.println("Person: " + p.getName()); for(Email e:p.getEmails()) { System.out.println("\tEmail: " + e.getEmail()); } } //sess.delete(person); tx.commit(); sess.close(); } } 但是发现运行这个代码就会报错: 具体的错误如下: 严重: Cannot add or update a child row: a foreign key constraint fails (`test`.`email`, CONSTRAINT `FK3F0537C1B8FA7CC` FOREIGN KEY (`ID`) REFERENCES `person2` (`ID`)) Exception in thread "main" org.hibernate.exception.ConstraintViolationException: could not insert: [dom.Email]。 LZ是这些个框架的小白,望大神们指导,如何改这个错误。
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。