首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

Hibernate一对多关联,能查询,但不能联结插入,该怎么处理

2012-01-05 
Hibernate一对多关联,能查询,但不能联结插入ava程序:Account.javapackage testimport java.util.Setpubl

Hibernate一对多关联,能查询,但不能联结插入
ava程序:
Account.java
package test;

import java.util.Set;

public class Account {
int aid;

String name = null;

String password = null;

Set email_Adr;

/**
* @return Returns the name.
*/
public String getName() {
return name;
}

/**
* @param name
* The name to set.
*/
public void setName(String name) {
this.name = name;
}

/**
* @return Returns the password.
*/
public String getPassword() {
return password;
}

/**
* @param password
* The password to set.
*/
public void setPassword(String password) {
this.password = password;
}

public int getAid() {
return aid;
}

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

public Set getEmail_Adr() {
return email_Adr;
}

public void setEmail_Adr(Set email) {
this.email_Adr = email;
}
}
Email_Adr.java
package test;

import java.util.HashSet;
import java.util.Set;



public class Email_Adr {
int eid;
String emailAdrr;
Account account;
public Account getAccount() {
return account;
}
public void setAccount(Account account) {
this.account = account;
}
public int getEid() {
return eid;
}
public void setEid(int id) {
this.eid = id;
}
public String getEmailAdrr() {
return emailAdrr;
}
public void setEmailAdrr(String emailAdrr) {
this.emailAdrr = emailAdrr;
}

}
数据库描述:
CREATE TABLE `account` (
  `aid` int(6) unsigned NOT NULL auto_increment,
  `name` char(10) default NULL,
  `password` char(10) default NULL,
  PRIMARY KEY (`aid`)
) ENGINE=MyISAM AUTO_INCREMENT=13 DEFAULT CHARSET=gbk;

CREATE TABLE `email_adr` (
  `eid` int(6) unsigned NOT NULL auto_increment,
  `emailAdrr` varchar(20) default NULL,
  `aaid` tinyint(4) default NULL,
  PRIMARY KEY (`eid`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=gbk;

配置文件:
Account.hbm.xml
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE hibernate-mapping
  PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
  "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>

  <class name="test.Account" table="account">
  <id name="aid" column="aid">
  <generator class="assigned" />
  </id>
  <property name="name" />
  <property name="password" />

  <set name="Email_Adr" table="email_adr" lazy="true"
  cascade="all" inverse="true">
  <key column="aaid" ></key>
  <one-to-many class="test.Email_Adr" />
  </set>

  </class>




</hibernate-mapping>

Email:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping
  PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
  "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>

  <class name="test.Email_Adr" table="email_adr">
  <id name="eid" column="eid">
  <generator class="assigned" />
  </id>
<many-to-one name="Account" column="aaid" class="test.Account" cascade="all" ></many-to-one>


  <property name="emailAdrr" />
  </class>

</hibernate-mapping>
测试程序:
package test;

import org.hibernate.*;
import org.hibernate.cfg.Configuration;

import java.util.Set;
import java.util.HashSet;
import java.sql.*;
import java.util.List;
import java.util.Iterator;

public class TestOneToMany
{
  SessionFactory sf;
  Session session;

  public TestOneToMany ()
  {
  try
  {
  Configuration cfg = new Configuration ();
  sf = cfg.configure ().buildSessionFactory ();
  } catch (HibernateException ex)
  {
  ex.printStackTrace ();
  }
  }

  public void doCreate ()
  {
  try
  {
  session = sf.openSession ();
  Transaction tx = session.beginTransaction ();

  // Account acnt = new Account();
  // Query query = session.createQuery("from Account where name=
  // :name");
  // query.setString("name", "gao");
  // acnt = (Account) query.list().get(0);
  // Email_Adr email = new Email_Adr();
  // email.setEmailAdrr("sealjifeng@168.com");

  Account account = new Account ();
  account.setName ("abcd");
  account.setPassword ("22");
  Set emailSet = new HashSet ();
  Email_Adr email = new Email_Adr ();
  email.setEmailAdrr ("sealjifeng@168.com");
  email.setAccount(account);
  emailSet.add (email);
  account.setEmail_Adr (emailSet);

  session.save (account);
  //session.save (email);
  // account.setEmail_Adr(emailSet);
  // account.getEmail_Adr().add(email);
  // //session.save(account);
  // acnt.setEmail_Adr(emailSet);
  // session.save(acnt);
  tx.commit ();
  session.close ();

  } catch (HibernateException ex)
  {
  ex.printStackTrace ();
  }
  }

  public void doQuery ()
  {
  try
  {
  session = sf.openSession ();
  Query q = session.createQuery ("from Account");
  List l = q.list ();
  Account a = null;
  Email_Adr eml = null;
  for (int i = 0; i < l.size (); i++)
  {
  a = (Account) l.get (i);
  System.out.println ("姓名: " + a.getName ());
  System.out.println ("密码: " + a.getPassword ());
  System.out.print ("所有的email:");
  Iterator it = a.getEmail_Adr ().iterator ();
  while (it.hasNext ())
  {
  eml = (Email_Adr) it.next ();
  System.out.print (eml.getEmailAdrr () + " ");
  }
  System.out.println ();
  }

  } catch (HibernateException ex)
  {
  ex.printStackTrace ();
  } finally
  {
  try
  {


  session.close ();
  } catch (HibernateException ex2)
  {
  }
  }
  }

  public static void main (String[] args)
  {

  TestOneToMany t = new TestOneToMany ();
  //t.doCreate ();
  t.doQuery();
  }
}

Query可以,但是crete怎么弄也不行。求解

[解决办法]
inverse = true应该由一得那端存吧。
[解决办法]
Account account = new Account (); 
account.setName ("abcd"); 
account.setPassword ("22"); 
Set emailSet = new HashSet (); 
Email_Adr email = new Email_Adr (); 
email.setEmailAdrr ("sealjifeng@168.com"); 
email.setAccount(account); 
emailSet.add (email); 

account.setEmail_Adr (emailSet);
、 session.save (account); 

配置好关系后直接保存一的一方就行了,多的会自动插入

热点排行