hibernate一对多双向关联总是不成功,求助啊
数据库中表是这样的一个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>
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(); }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 和数据库的性能相关。