java - JPA:正确保留 ManyToOne 实体

标签 java hibernate jakarta-ee jpa hibernate-mapping

我已经寻找了一个多星期来解决我的问题,但没有得到任何明确的结果,尽管这似乎是一个基本问题。 如果我做错了什么或者有什么误解,请告诉我。

情况如下:

用户连接到平台进行交易。 所以我在用户和交易实体之间有多对一的关系。 (一个用户进行多笔交易,每笔交易仅由一个用户进行)

这个想法是,当我持久化一个新的“交易”时,平台当前用户的 UserId 将作为交易表的外键。

问题是:

  1. 当我尝试保留新的“交易”时,也会出现一个新的“用户” 使用新的 UserId 创建。

  2. 我不知道如何正确获取要添加的当前用户的 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/

相关文章:

Java EE 6 程序安全性、glassfish 和 JDBC 领域

java - 对月份名称进行排序

java - 如何使用 git api 的 java 库以编程方式从哈希值远程获取标签或分支名称?

java - java中如何将日期时间转换为时间戳

oracle - 有没有办法让 Hibernate 使用文字值而不是绑定(bind)变量?

Eclipse 中的 Java EE 模块依赖项页面缺少项目

java - 使用 JTabbedPane 时抛出异常

java - 从命令行启动 Minecraft - 用户名和密码作为前缀

java - 由 : java. io.FileNotFoundException : Could not open ServletContext resource [/applicationContext. xml 引起]

jsf - 使用 JSF 和 Java EE Batch 上传时是否可以处理文件流?