sealjifeng 2009-08-13 21:35
浏览 215
已采纳

Hibernate一对多关联,能查询,但不能联结插入

java程序:
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">

<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>

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">

<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>


测试程序:
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怎么弄也不行。求解

  • 写回答

1条回答 默认 最新

  • haozh502 2009-08-13 23:07
    关注

    没有建立关系
    email.setAccount(account);
    account.getEmail().add(email);

    Account.java

    package test;

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

    public class Account {
    private int aid;

    private String name = null;
    
    private String password = null;
    
    private Set<Email_Adr> email = new HashSet<Email_Adr>();
    
    public int getAid() {
        return aid;
    }
    
    public void setAid(int aid) {
        this.aid = aid;
    }
    
    public Set<Email_Adr> getEmail() {
        return email;
    }
    
    public void setEmail(Set<Email_Adr> email) {
        this.email = email;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public String getPassword() {
        return password;
    }
    
    public void setPassword(String password) {
        this.password = password;
    }
    

    }

    Email_Adr.java

    package test;

    public class Email_Adr {
    private int eid;

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

    }

    配置文件
    Account.hbm.xml

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













    Email_Adr.hbm.xml

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









    测试类:
    TestOneToMany.java

    package test;

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

    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 account = new Account();
            account.setName("abcd");
            account.setPassword("22");
    
            Email_Adr email = new Email_Adr();
            email.setEmailAdrr("sealjifeng@168.com");
            // 建立关系
            email.setAccount(account);
            account.getEmail().add(email);
    
            session.save(account);
            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().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();
    }
    

    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突