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