我已经寻找了一个多星期来解决我的问题,但没有得到任何明确的结果,尽管这似乎是一个基本问题。 如果我做错了什么或者有什么误解,请告诉我。
情况如下:
用户连接到平台进行交易。 所以我在用户和交易实体之间有多对一的关系。 (一个用户进行多笔交易,每笔交易仅由一个用户进行)
这个想法是,当我持久化一个新的“交易”时,平台当前用户的 UserId 将作为交易表的外键。
问题是:
当我尝试保留新的“交易”时,也会出现一个新的“用户” 使用新的 UserId 创建。
我不知道如何正确获取要添加的当前用户的 ID 它在事务表中
这是我的代码:
交易实体:
@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;
}
我的 ManagedBean 方法 doTransaction:
public String doTransaction(){
String navigateTo="/pages/expediteur/succes";
transaction.setExpediteur(expediteur);
transactionServiceLocal.updateTransaction(transaction);
return navigateTo;
}
希望我的解释清楚而简短。
* 编辑*
感谢您的帮助,我已尝试实现评论中提到的解决方案,但现在出现此错误:
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 作为返回。
我认为我的问题是正确获取数据库中存储的实体。
最佳答案
假设您有权访问用户 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;
}
关于java - JPA:正确保留 ManyToOne 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30936503/