2015-06-19 3 views
1

Я искал более недели для исправления моей проблемы, но без каких-либо ясных результатов, хотя это кажется основной проблемой. Пожалуйста, дайте мне знать, если я делаю что-то неправильно или у меня есть недоразумение.JPA: Устойчивые объекты ManyToOne правильно

Вот ситуация:

Пользователь подключается к платформе для выполнения операций. Таким образом, у меня есть много отношений между объектами User и Transaction. (Пользователь делает много транзакций, и каждая транзакция совершается только одним пользователем)

Идея состоит в том, что когда я сохраняю новую «транзакцию», пользовательский идентификатор текущего пользователя платформы переходит в качестве внешнего ключа для таблицу транзакций.

Проблема заключается в том:

  1. при попытке упорствовать новый «Сделка», новый «Пользователь» также создан новый UserId.

  2. Я не нахожу, как получить правильно идентификатор текущего пользователя, чтобы добавить его в таблице транзакций

Вот мой код:

Объект сделки:

@Entity 
public class Transaction implements Serializable{ 

@Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(unique = true, nullable = false) 
int idTransaction; 

@ManyToOne(cascade=CascadeType.MERGE) 
@JoinColumn(name="FK_User") 
User user; 

} 

субъект Пользователь:

@Entity 
public class User implements Serializable{ 

int idUser; 

@OneToMany(mappedBy="user") 
Set<Transaction> transactions; 
} 

Мой метод doTransaction из ManagedBean:

public String doTransaction(){ 

    String navigateTo="/pages/expediteur/succes"; 

    transaction.setExpediteur(expediteur); 
    transactionServiceLocal.updateTransaction(transaction); 

    return navigateTo; 
} 

Надежда Я был ясен и краток в своем объяснении.

* EDIT *

Спасибо за помощь, я пытался реализовать решения в упоминалось комментарии, но теперь я получаю эту ошибку:

ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-46) Cannot add or update a child row: a foreign key constraint fails 

и когда я добавляю эти строки в мой код:

System.out.println("The current user is "+user.getIdUser()); 
System.out.println("Your current transaction is "+user.getIdTransaction()); 

Я получаю 0 для всех объектов в качестве возврата.

Я думаю, что моя проблема правильна для моих объектов, хранящихся в базе данных.

ответ

1

Если у вас есть доступ к пользовательскому ID:

public Transaction createAndPersistTransaction(Long userId) { 
    // get a reference to the given user: 
    User user = em.getReference(User.class, userId); 
    // create a transaction 
    Transaction tx = new Transaction(); 
    // set its user: 
    tx.setUser(user); 
    // persist it 
    em.persist(tx); 
    return tx; 
} 
+0

Спасибо за помощь, я пытался реализовать решения в упоминались комментарии, но теперь я получаю эту ошибку: ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (по умолчанию задача-46) Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа завершилось ошибкой , и когда я добавлю эти строки в свой код: System.out.println («Текущий пользователь» + user.getIdUser()); System.out.println («Ваша текущая транзакция:« + user.getIdTransaction()); Я получаю 0 для всех объектов в качестве возврата. Я думаю, что моя проблема правильна для моих объектов, хранящихся в базе данных. – Lyes

0

Прежде всего, пользователь должен иметь @Id и вы можете установить cascade = CascadeType.ALL на one-to-many стороне):

@Entity 
public class User implements Serializable{ 

    @Id 
    Integer idUser; 

    @OneToMany(mappedBy="user", cascade = CascadeType.ALL) 
    Set<Transaction> transactions = new HashSet()<>; 
} 

Теперь у вас должен быть userId, который был отправлен из пользовательского интерфейса, поэтому вы должны сначала получить пользователя:

User user = em.getReference(User.class, userId); 

Вы можете создать транзакцию и назначить обе стороны ассоциаций:

Transaction tx = new Transaction(); 
tx.setUser(user); 
user.getTransactions().add(tx); 
em.flush(); 

Transaction будут сохранены автоматически, как только он получает связанный с User сущности.

+0

Благодарим за помощь. Я попытался реализовать решения, упомянутые в комментариях, но теперь я получаю эту ошибку: ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (задание по умолчанию-46) Не удается добавьте или обновите дочернюю строку: ограничение внешнего ключа завершится ошибкой , и когда я добавлю эти строки в свой код: System.out.println («Текущий пользователь» + user.getIdUser()); System.out.println («Ваша текущая транзакция:« + user.getIdTransaction()); Я получаю 0 для всех объектов в качестве возврата. Я думаю, что моя проблема правильна для моих объектов, хранящихся в базе данных. – Lyes

+0

Вы можете принять ответ, если вам понравилось. –

Смежные вопросы