当前位置: 首页 > 知识库问答 >
问题:

如何在springboot中将包含多个数据的json主体插入到多个具有关系的表中

乐正晟
2023-03-14

我有两个实体:UserEntity和LoginEntity,每个实体都有CrudePositories。实体之间的关系为OneToOne,其中一个用户将拥有一个登录帐户。我还创建了一个控制器,我可以从数据库中获取所有数据,也就是说,当调用getalluser时,我可以让所有具有关系的用户登录。当我调用getAllLogins时,我会得到所有登录帐户。我还分别使用API插入了用户和登录名,这很好,但这将忽略外键用户id。

现在,因为am知道am stack如何插入用户,并通过一个json主体分别使用它们的关系登录

@Entity@Table(name="user_table")public class UserEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long uid;

private String fname;
private String lname;

@OneToOne( cascade = CascadeType.ALL, mappedBy = "userEntityFk")
private LoginEntity logins;

public UserEntity() {
    super();
}
public Long getUid() {
    return uid;
}
public void setUid(Long uid) {
    this.uid = uid;
}
public String getFname() {
    return fname;
}
public void setFname(String fname) {
    this.fname = fname;
}
public String getLname() {
    return lname;
}
public void setLname(String lname) {
    this.lname = lname;
}
public LoginEntity getLogins() {
    return logins;
}
public void setLogins(LoginEntity logins) {
    this.logins = logins;
}
public UserEntity(Long uid, String fname, String lname, LoginEntity logins) {
    super();
    this.uid = uid;
    this.fname = fname;
    this.lname = lname;
    this.logins = logins;
}

@Entity @Table(name="login_table") public class LoginEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long lid;

private String username;
private String password;

@OneToOne(cascade = CascadeType.ALL )
private UserEntity userEntityFk;

public LoginEntity() {
    super();
}
public LoginEntity(Long lid, String username, String password, UserEntity userEntityFk) {
    super();
    this.lid = lid;
    this.username = username;
    this.password = password;
    this.userEntityFk = userEntityFk;
}
public Long getLid() {
    return lid;
}
public void setLid(Long lid) {
    this.lid = lid;
}
public String getUsername() {
    return username;
}
public void setUsername(String username) {
    this.username = username;
}
public String getPassword() {
    return password;
}
public void setPassword(String password) {
    this.password = password;
}
public UserEntity getUserEntityFk() {
    return userEntityFk;
}
public void setUserEntityFk(UserEntity userEntityFk) {
    this.userEntityFk = userEntityFk;
}   

}

@Repository 
public interface LoginRepo extends CrudRepository<LoginEntity, Integer> {

} 

@Repository 
public interface UserRepo extends CrudRepository<UserEntity, Integer> {

}

@RestController
@RequestMapping(path="/api")
public class MainController {

@Autowired 
private UserRepo userRepository;

@Autowired
private LoginRepo loginRepository;

//===this works fine i can get all the users after insert
@GetMapping(path="/user_acc")
  public @ResponseBody Iterable<UserEntity> getAllUsers() {
    // This returns a JSON or XML with the users
    return userRepository.findAll();
  }
//================this too works fine after insert
@GetMapping(path="/login_acc")
  public @ResponseBody Iterable<LoginEntity> getAlllogins() {
    // This returns a JSON or XML with the users
    return loginRepository.findAll();
  }
//===adding single user works fine. and it returns user_id
@PostMapping("/user_acc")
public Long addNewUser(@RequestBody UserEntity userz){
    UserEntity ue = userRepository.save(userz);
    return ue.getUid(); 
}

     //===this works but the foreign key not inserted and thats where my problem is
 @PostMapping("/login_acc")
    public LoginEntity addNewLogin(@RequestBody LoginEntity loginz){
        return loginRepository.save(loginz);
    }

}

class UserLogin{ 
   UserEntity myuser; 
   LoginEntity mylogin; 
   
   public UserEntity getMyuser() { 
       return myuser; 
    } 
 
   public void setMyuser(UserEntity myuser) { 
       this.myuser = myuser; 
   } 

   public LoginEntity getMylogin() { 
      return mylogin; 
   } 
    
   public void setMylogin(LoginEntity mylogin) { 
     this.mylogin = mylogin; 
    }

}

result on post http://localhost:8080/api/login_acc. account created but no foreign key
result on post http://localhost:8080/api/login_acc. account created but no foreign key
{
"lid": 1,
"username": "admin1",
"password": "11111",
"userEntityFk": null
}

result on geting all users on get method http://localhost:8080/api/user_acc
{
"uid": 1,
"fname": "hassan",
"lname": "zahor",
"logins": null
}

what i want to post is this body below to multiple tables
{
"fname":"hassan",
"lname":"zahor",
"username": "admin5",
"password": "55555"
}

共有1个答案

洪高扬
2023-03-14

这一个应该更有效:

{
"fname":"hassan",
"lname":"zahor",
"userEntityFk" : {
   "username": "admin5",
   "password": "55555"
   }
}

然而,如果endpoint返回一个包含循环包含的对象,则会出现错误:spring将尝试无限期地将其映射到json。

您可以纠正此问题,在从控制器返回结果之前将结果映射到另一个对象,或者只是从用户实体中删除属性“登录”。

 类似资料:
  • 我的结构如下: 3张表格:电影、演员、类型 电影表模式: 类型表架构: 演员表架构: 电影模组: 体裁模态: 演员模式: 表格: 我使用以下控制器方法从表单发布数据,一切正常,但当我提交2部电影具有相同的流派,例如“动作/戏剧”,我在流派表中得到2个单独的条目,如: id:1名称:动作/戏剧 ID: 2名称:动作/戏剧 对于一个特定的流派类型,反复使用单个id的最佳方法是什么?例如,如果我添加了1

  • 问题内容: 我正在使用SQL Server 2005。 我正在将数据从当前数据库(单个表)迁移到新数据库(规范化-许多表)。在新数据库中,我有一个基表(我们称它为“ BaseTable”)和多个其他表(我们称它们为和)。来自旧数据库的某些数据将转到BaseTable,而另一些将转到其他两个。BaseTable与DependentA和DependentB都具有一对一关系,使用它们的ID作为外键。 所

  • 我创建了两个表: > 具有列 (主键、自动递增)、、、的表 表包含列(主键,自动增量),(的外键), 我有表格来创建具有现有角色的新员工。要插入的数据示例: 我想在SQL Server 2014中编写一个存储过程,将新的staff插入到<code>tblStaff。 那我该怎么办? 如果我的问题与其他问题重复,我很抱歉。我对SQL更感兴趣。谢谢你的帮助。

  • 问题内容: 有三个表:,并且,医院能提供的医疗服务和语言服务。因此,存在两个多对多关系。 简单ERD 现在,我想使用和搜索医院数据。 DaoImpl: 而且,如果我想从三个表中按邮政编码,医疗类型和语言进行搜索,那么如何编写一个jsql。 警告: 错误:org.hibernate.hql.internal.ast.ErrorCounter- 预期加入的路径!希望加入的路径!在org.hiberna

  • 我正在开发基于spring+Hibernate的web应用程序。在这个应用程序中,我必须对数据库中的50000个可用记录进行计算。当前逻辑:- 循环0到50000(所有50000记录彼此独立) 选择第i个元素 对第i个元素执行计算(删除CALCULATION_TEMP表(如果存在),创建新表CALCULATION_TEMP并在CALCULATION_TEMP表中插入计算) 在步骤3表上进行一些计算

  • 问题内容: 有人可以告诉我,以下JDBC代码中的第一个条件是否是针对两个不同的表执行两个不同的SQL查询? 问题答案: 在我的书中,我总是建议关闭已经打开的资源,以避免可能的泄漏。 一种更现代的方法是使用try-with- resources :