读书人

hibernate一对多双向关联总是不成功

发布时间: 2012-10-19 16:53:35 作者: rapoo

hibernate一对多双向关联总是不成功,求助啊
数据库中表是这样的一个user对应多个bankAccount,为了运行成功,没有加外键

Java code
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;}


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

Java code
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
2222Mervyn Wu0
User
1 m.wu1234562012-09-29 13:42:50

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

求助,我究竟是哪里错了?

[解决办法]
Java code
 session.save(user);        session.save(bankAcc);        bankAcc.setBankUser(user);
[解决办法]
你的事务呢
[解决办法]
你这个有这几个地方的问题:
1,你的命名不规范,属性的开头两个字母应该用小写
2,你的配置也有问题,<set name="BankAccounts" table="bankaccount" inverse="true">
<key>
<column name="UserId"/>


</key>
<one-to-many class="Model.BankAccount" />
</set>
你是1:多的关系,不是多对多,不需要table 这个中间表的。
你的关系,数据库也要设置好。
[解决办法]
给你一个建议,不要在 ORM 中建议一对多、多对多的关联,更不要去建双向关联,也不要使用 Hibernate 中所谓 cascade 的东西。也不要在数据表中建立外键约束(相关表只有数据库上的依赖,没有外键的约束),所有的数据完整性由应用程序来保证。

至于为什么这样,也不是一两句话能说清楚的,主要跟 ORM 和数据库的性能相关。

读书人网 >J2EE开发

热点推荐