Java JPA:正确持久化多个实体

Java JPA:正确持久化多个实体,java,hibernate,jakarta-ee,jpa,hibernate-mapping,Java,Hibernate,Jakarta Ee,Jpa,Hibernate Mapping,我已经找了一个多星期来解决我的问题,但没有得到任何明确的结果,尽管这似乎是一个基本的问题。 如果我做错了什么或者有什么误解,请告诉我 情况如下: 用户连接到平台进行交易。 因此,在用户和事务实体之间存在多对一关系。 (一个用户进行多个事务,每个事务仅由一个用户进行) 其思想是,当我持久化一个新的“事务”时,平台当前用户的UserId作为外键进入事务表 问题是: 当我试图持久化一个新的“事务”时,一个新的“用户”也会被持久化 使用新用户ID创建 我找不到如何正确获取要添加的当前用户的ID 它在事务

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

情况如下:

用户连接到平台进行交易。 因此,在用户和事务实体之间存在多对一关系。 (一个用户进行多个事务,每个事务仅由一个用户进行)

其思想是,当我持久化一个新的“事务”时,平台当前用户的UserId作为外键进入事务表

问题是:

  • 当我试图持久化一个新的“事务”时,一个新的“用户”也会被持久化 使用新用户ID创建

  • 我找不到如何正确获取要添加的当前用户的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;   
    }
    
    希望我的解释清楚而简短

    *编辑*


    感谢您的帮助,我已尝试实施评论中提到的解决方案,但现在我遇到了以下错误:

    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;
    }
    

    首先,用户应该有一个@Id,您可以在
    一对多
    侧设置
    cascade=CascadeType.all

    您可以创建事务并分配关联的双方:

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

    事务
    一旦与
    用户
    实体关联,就会自动保存。

    感谢您的帮助,我已经尝试实现注释中提到的解决方案,但现在我遇到了以下错误:错误[org.hibernate.engine.jdbc.spi.SqlExceptionHelper](默认任务-46)无法添加或更新子行:外键约束失败,当我将这些行添加到代码中时:System.out.println(“当前用户是”+user.getIdUser());System.out.println(“您当前的事务是”+user.getIdTransaction());我得到所有实体的0作为回报。我认为我的问题是如何正确地访问数据库中存储的实体。感谢您的帮助,我已尝试实现注释中提到的解决方案,但现在我遇到了以下错误:错误[org.hibernate.engine.jdbc.spi.SqlExceptionHelper](默认任务-46)无法添加或更新子行:外键约束失败,当我将这些行添加到代码中时:System.out.println(“当前用户是”+user.getIdUser());System.out.println(“您当前的事务是”+user.getIdTransaction());我得到所有实体的0作为回报。我认为我的问题是如何正确地访问数据库中存储的实体。
    @Entity
    public class User implements Serializable{
    
        @Id
        Integer idUser;
    
        @OneToMany(mappedBy="user", cascade = CascadeType.ALL)
        Set<Transaction> transactions = new HashSet()<>;   
    }
    
    User user = em.getReference(User.class, userId);
    
    Transaction tx = new Transaction();
    tx.setUser(user);
    user.getTransactions().add(tx);
    em.flush();