我在保存记录时遇到问题,因为如果有很多关系,我在映射表中有一个额外的列。请参阅下面的详细信息。
User和BankAccounts之间存在许多关系。除了User和BankAccount表的主键之外,user_bankaccounts的映射表还有一个名为user_type的额外列。但是,当我尝试保存银行帐户记录时,映射表数据未插入user_bankaccount表中。仅插入bankaccount表。我相信我不应该自己更新映射表,而hibernate会自动更新相应的映射表。
@Entity
@Table(name = "Users")
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int userId;
@OneToMany(mappedBy = "user", fetch = FetchType.EAGER)
private Set<UserBankAccounts> userBankSet = new HashSet<UserBankAccounts>();
}
@Entity
@Table(name = "bankaccounts")
public class BankAccount implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "bank_account_id")
private int accountId;
@OneToMany(mappedBy = "bankAccounts", fetch = FetchType.EAGER)
private List<UserBankAccounts> userBankList = new ArrayList<UserBankAccounts>();
}
@Entity
@Table(name = "user_bankaccount")
@IdClass(UserBankAccountAssociationId.class)
public class UserBankAccounts {
@Id
@Column(name = "user_id", insertable = false, updatable = false)
private int userId;
@Id
@Column(name = "bank_account_id", insertable = false, updatable = false)
private int accountId;
@Column(name = "user_type")
private String userType;
@ManyToOne
@JoinColumn(name="user_id")
private User user;
@ManyToOne
@JoinColumn(name="bank_account_id")
private BankAccount bankAccounts;
}
public class UserBankAccountAssociationId implements Serializable {
private int userId;
private int accountId;
}
@Test
@Loggable(value = LogLevel.DEBUG)
public void addBankAccount() {
Bank bank = bankdao.getBankByName("bank name").get(0);
User u1 = userdao.getUserByName("xxx", "yyy").get(0);
BankAccount ba = new BankAccount();
ba.setAccountType("Savings");
ba.setBank(bank);
ba.setBranch("xxx");
ba.setAccountNumber("112233445566");
ba.setOpMode("xxx");
UserBankAccounts userBankAcct = new UserBankAccounts();
userBankAcct.setUser(u1);
userBankAcct.setBankAccounts(ba);
userBankAcct.setUserId(u1.getUserId());
userBankAcct.setAccountId(ba.getAccountId());
userBankAcct.setUserType("Primary User");
u1.getUserBankSet().add(userBankAcct);
ba.getUserBankList().add(userBankAcct);
bankAccountDAO.addBankAccount(ba);
}
答案 0 :(得分:2)
我认为你对Idclass注释有误解。你应该看看这个例子。 Many To Many sample
如果您使用示例中的映射,hibernate将自动为您创建连接表。但是,如果要在连接表上添加额外的列(例如user_type),则必须自己创建连接表。
@Entity
@Table(name = "user_bankaccount")
public class UserBankAccounts {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "user_type")
private String userType;
@ManyToOne
@JoinColumn(name="user_id")
private User user;
@ManyToOne
@JoinColumn(name="bank_account_id")
private BankAccount bankAccounts;
}
不需要userId和accountId字段。如果您希望在bankaccount或用户持久化时保存/删除/更新userbankaccounts,请在您的bankaccount或用户实体中使用级联注释。
答案 1 :(得分:1)
我想回答这个问题为时已晚,但为读者添加,请参考this link
用@PrimaryKeyJoinColumn替换@JoinColumn 所以你的代码看起来如下
@ManyToOne
@PrimaryKeyJoinColumn(name = "bank_account_id", referencedColumnName = "referencedColumnName ")
private BankAccount bankAccounts;
答案 2 :(得分:0)
如果要在保存银行或用户类时保存关联类,则必须将casscade属性设置为银行焦虑/用户类的关联类。