【问题标题】:Insert data to multiple tables in spring jpa在spring jpa中将数据插入多个表
【发布时间】:2020-12-20 05:04:05
【问题描述】:
我有两个表,user 和 transaction。其中one user 可以有many transactions。所以,每次我create new user,他们都会自动生成new transaction,transaction type 是SEND MONEY。但我不明白如何在 Spring JPA 中编写它。请查看我的代码并帮助我。
用户.java
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private long id;
@Column(name = "name")
private String name;
@Column(name = "email")
private String email;
@Column(name = "password")
private String password;
@Column(name = "money")
private int money;
//Getter Setter Constructor
}
Transaction.java
@Entity
@Table(name = "transaction")
public class Transaction {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id_trans")
private long id_trans;
@Column(name = "id_user")
private long id_user;
@Column(name = "transaction_date")
private Timestamp transaction_date;
@Column(name = "type") //Default set as "SEND MONEY"
private String type;
@Column(name = "trans_money") //From money in User.class
private int trans_money;
//Getter Setter Constructor
}
我知道我应该在我的 UserDAO.java 中做点什么,但我仍然不知道如何从 body 发送数据并将其拆分(?)成两个对象(user 和 @ 987654329@,所以我可以将其持久化到 UserDAO)。
【问题讨论】:
标签:
java
mysql
spring
jpa
【解决方案1】:
首先要写好User和Transaction的关系。
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private long id;
@Column(name = "name")
private String name;
@Column(name = "email")
private String email;
@Column(name = "password")
private String password;
@Column(name = "money")
private int money;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
private Set<Transaction> transactions = new HashSet<>();
//Getter Setter Constructor
}
@Entity
@Table(name = "transaction")
public class Transaction {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id_trans")
private long id_trans;
@Column(name = "id_user")
private long id_user;
@Column(name = "transaction_date")
private Timestamp transaction_date;
@Column(name = "type") //Default set as "SEND MONEY"
private String type;
@Column(name = "trans_money") //From money in User.class
private int trans_money;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(referencedColumnName = "id")
private User user;
//Getter Setter Constructor
}
然后你必须为用户创建 JPA 存储库接口
@Repository
public interface UserRepo extends CrudRepository <User, Long> {
}
然后在一个服务中,你可以做如下操作
@Service
public class UserService {
private UserRepo userRepo;
@Autowired
MealService(UserRepo userRepo){
this.userRepo = userRepo;
}
public void CreateNewUser(){
User user = new User();
// set its values
Transaction transaction = new Transaction();
transaction.setType("SEND MONEY");
// set other values
user.getTransactions().add(transaction);
userRepo.save(user);
}
}
【解决方案2】:
查看提到的@Entity 类,在我看来,Transaction 和User 之间存在@ManyToOne 关联,这在实体关系建模/映射中未捕获。
请考虑在您的Transaction 实体中进行如下建模,
@Entity
@Table(name = "transaction")
public class Transaction {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id_trans")
private long id_trans;
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE}, fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
@Column(name = "transaction_date")
private Timestamp transaction_date;
@Column(name = "type") //Default set as "SEND MONEY"
private String type;
@Column(name = "trans_money") //From money in User.class
private int trans_money;
//Getter Setter Constructor
}
完成此操作后,您可以为 Transaction 和 User 创建 JPA 存储库类,并在构建实例后简单地使用 save 方法在事务中执行您想要的操作。更多关于 Spring Data JPA 中的事务here
public interface TransactionRepository extends JpaRepository<Transaction, Long> {
}