【问题标题】:JPA Hibernate - Issue with manytomany mapping with extra column in the mapping tableJPA Hibernate - 映射表中带有额外列的多映射问题
【发布时间】:2010-12-11 15:14:31
【问题描述】:

当我在映射表中有一个额外的列以防多对多关系时,我在保存记录时遇到问题。详情请看下文。

User 和 BankAccounts 之间存在多对多关系。除了 User 和 BankAccount 表的主键之外,user_bankaccounts 的映射表还有一个名为 user_type 的额外列。但是,当我尝试保存银行帐户记录时,映射表数据不会插入 user_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);
}

【问题讨论】:

    标签: hibernate jpa many-to-many


    【解决方案1】:

    我认为您对 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 字段。如果您希望在银行帐户或用户持久化时保存/删除/更新用户银行帐户,请在您的银行帐户或用户实体中使用级联注释。

    【讨论】:

      【解决方案2】:

      我想回答这个问题为时已晚,但为读者补充,请参考this link

      用@PrimaryKeyJoinColumn 替换@JoinColumn 所以你的代码如下所示

      
       @ManyToOne
       @PrimaryKeyJoinColumn(name = "bank_account_id", referencedColumnName = "referencedColumnName ")
       private BankAccount bankAccounts;
      

      【讨论】:

        【解决方案3】:

        如果你想在保存bank或者user class的时候保存关联类,那么你需要在bank anx/or user class设置casscade属性为relatin。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-01-31
          • 1970-01-01
          • 2017-01-12
          • 1970-01-01
          • 1970-01-01
          • 2017-01-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多