数据库中表是这样的一个user对应多个bankAccount,为了运行成功,没有加外键public class User {
private int UserId;
private String Username;
private String Password;
private Date RegisterTime;
private Set<BankAccount> BankAccounts = new HashSet<BankAccount>();
}public class BankAccount {
private int CardNumber;
private String AccountName;
private User BankUser;
}<hibernate-mapping><class name="Model.BankAccount" table="bankaccount"><id name="CardNumber" type="int" column="CardNumber" >
<generator class="assigned"/>
</id>
<property name="AccountName" column="AccountName" />
<many-to-one name="BankUser" column="UserId" class="Model.User"/>
</class>
</hibernate-mapping><hibernate-mapping><class name="Model.User" table="user"><id name="UserId" type="int" column="UserId" >
<generator class="assigned"/>
</id>
<property name="Username" column="Username" />
<property name="Password" column="Password" />
<property name="RegisterTime" type="timestamp" column="RegisterTime"/>
<set name="BankAccounts" table="bankaccount" inverse="true">
    <key>
        <column name="UserId"/>
    </key>
    <one-to-many class="Model.BankAccount" />
</set>
</class>
</hibernate-mapping>想同时插入一个user 和一个bank Account
public void saveUserAndBank(String username, String password, int CardNo, String AccountName) {
        session.beginTransaction();
        User user = new User();
        user.setUsername(username);
        user.setPassword(password);
        user.setRegisterTime(new Date());
                
        // create bank account
        BankAccount bankAcc = new BankAccount();
        bankAcc.setCardNumber(CardNo);
        bankAcc.setAccountName(AccountName);
        session.save(user);
        session.save(bankAcc);
        bankAcc.setBankUser(user);
        user.getBankAccounts().add(bankAcc);
        session.getTransaction().commit();       
    }
可是每次运行这个后saveUserAndBank("m.wu", "123456", 2222, "Mervyn Wu");,只在数据中插入了两条数据
Bank Account
2222 Mervyn Wu 0
User
1       m.wu 123456 2012-09-29 13:42:50Bank Account数据没有把 UserID设为1,这是什么情况
如果我加在BankAccount中加入UserID外键 update delete 都设为cascade,就有运行错误
 Cannot add or update a child row: a foreign key constraint fails (`lottery/bankaccount`, CONSTRAINT `BankUserId` FOREIGN KEY (`UserId`) REFERENCES `user` (`UserId`) ON DELETE CASCADE ON UPDATE CASCADE)求助,我究竟是哪里错了?

解决方案 »

  1.   

     session.save(user);
            session.save(bankAcc);
            bankAcc.setBankUser(user);
    改成 session.save(user);
     bankAcc.setBankUser(user);
     session.save(bankAcc);
     试试
      

  2.   


    多谢,刚刚试过了,不行,好像save只是把一个对象和数据库联系起来,先后顺序不是很重要
      

  3.   

    你这个有这几个地方的问题:
    1,你的命名不规范,属性的开头两个字母应该用小写
    2,你的配置也有问题,<set name="BankAccounts" table="bankaccount" inverse="true">
        <key>
            <column name="UserId"/>
        </key>
        <one-to-many class="Model.BankAccount" />
    </set>
    你是1:多的关系,不是多对多,不需要table 这个中间表的。
    你的关系,数据库也要设置好。
      

  4.   

    给你一个建议,不要在 ORM 中建议一对多、多对多的关联,更不要去建双向关联,也不要使用 Hibernate 中所谓 cascade 的东西。也不要在数据表中建立外键约束(相关表只有数据库上的依赖,没有外键的约束),所有的数据完整性由应用程序来保证。至于为什么这样,也不是一两句话能说清楚的,主要跟 ORM 和数据库的性能相关。
      

  5.   


    我找到问题了,是因为Id generator 错了。
    你是说只做单一表的orm吗,是不是大部分企业都是这么做的,没有外键,检索的效率会不会低一些呢