JPA Hibernate - проблема со многими отображениями с дополнительным столбцом в таблице отображений - PullRequest
2 голосов
/ 11 декабря 2010

Я сталкиваюсь с проблемой при сохранении записи, когда у меня есть дополнительный столбец в таблице сопоставления в случае множества отношений.Подробности см. Ниже.

Между Пользователем и Банковскими счетами существует множество отношений.Таблица сопоставления для user_bankaccounts имеет дополнительный столбец с именем user_type, кроме первичных ключей таблицы User и BankAccount.Однако, когда я пытаюсь сохранить запись банковского счета, данные таблицы сопоставления не вставляются в таблицу 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);
}

Ответы [ 3 ]

2 голосов
/ 12 декабря 2010

Я думаю, что вы неправильно понимаете аннотацию Idclass.Вы должны взглянуть на этот пример. Пример "Многие ко многим"

Если вы используете отображение, как в примере, 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.И если вы хотите, чтобы учетные записи пользователя сохранялись / удалялись / обновлялись, когда учетная запись или учетная запись пользователя сохранялись, используйте каскадную аннотацию в своем банковском счете или пользовательских объектах.

1 голос
/ 20 июля 2011

Я думаю, что уже слишком поздно, чтобы ответить на этот вопрос, но добавляя для читателя, пожалуйста, обратитесь к этой ссылке

заменить @JoinColumn на @PrimaryKeyJoinColumn поэтому ваш код будет выглядеть следующим образом


 @ManyToOne
 @PrimaryKeyJoinColumn(name = "bank_account_id", referencedColumnName = "referencedColumnName ")
 private BankAccount bankAccounts;
0 голосов
/ 12 декабря 2010

Если вы хотите сохранить класс ассоциации при сохранении банка или пользовательского класса, то вы должны установить атрибут casscade в значение relatin at bank wor / / user class.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...