无法使用JPA获得自动生成的ID

问题描述 投票:0回答:2

我有两个实体。一个是UserEntity,另一个是TaskEntity。

@Entity
@Table(name="user")
public class UserEntity {
    @Id
    private String userEmail;
    private String password;
    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name="user_email")
    private List<TaskEntity> tasks;

    //getter setter for variables
}
@Entity
@Table(name="task")
public class TaskEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;
    private String description;
    private String statusDate;
    private String status;

    //getter setter for variables
}

现在,我想基于userEmail创建一个新任务,所以我在DAO类中按如下操作:

    @PersistenceContext
    EntityManager em;
    public Integer addNewTaskByUserEmail(Task task, String userEmail) {
        UserEntity userEntity = em.find(UserEntity.class, userEmail);
        TaskEntity taskEntity = new TaskEntity();
        taskEntity.setName(task.getName());
        taskEntity.setDescription(task.getDescription());
        taskEntity.setStatus(task.getStatus());
        taskEntity.setStatusDate(task.getDate());
        userEntity.getTasks().add(taskEntity);
        return taskEntity.getId();
    }

但是在return语句中,我在服务类中得到null。如何返回自动生成的taskId?

java hibernate spring-boot spring-data-jpa one-to-many
2个回答
0
投票

我尝试了一些方法,但如果正确还是不正确,则无法获得。

@Entity
@Table(name="user")
public class UserEntity {
    @Id
    private String userEmail;
    private String password;
    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name="user_email")
    private List<TaskEntity> tasks;

    //getter setter for variables
}
@Entity
@Table(name="task")
public class TaskEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;
    private String description;
    private String statusDate;
    private String status;
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="user_email")
    private UserEntity user;

    //getter setter for variables
}

现在在DAO层中,我正在按照以下步骤进行操作,并在服务层中获得taskId:

    @Override
    public Integer addNewTaskByUserEmail(Task task, String userEmail) {
        UserEntity userEntity = em.find(UserEntity.class, userEmail);
        TaskEntity taskEntity = new TaskEntity();
        taskEntity.setName(task.getName());
        taskEntity.setDescription(task.getDescription());
        taskEntity.setStatus(task.getStatus());
        taskEntity.setStatusDate(task.getDate());
        taskEntity.setUser(userEntity);
        em.persist(taskEntity);
        return taskEntity.getId();
    }

0
投票

一个可能的问题是您没有保存与用户关联的任务。保存任务,然后您便可以获取taskId。

public Integer addNewTaskByUserEmail(Task task, String userEmail) {
    UserEntity userEntity = em.find(UserEntity.class, userEmail);
    TaskEntity taskEntity = new TaskEntity();
    taskEntity.setName(task.getName());
    taskEntity.setDescription(task.getDescription());
    taskEntity.setStatus(task.getStatus());
    taskEntity.setStatusDate(task.getDate());
    em.getTransaction().begin();
    em.persist(taskEntity);
    em.getTransaction().commit();
    userEntity.getTasks().add(taskEntity);
    return taskEntity.getId();
}

OR

    @Autowired TaskRepository taskRepository

    public Integer addNewTaskByUserEmail(Task task, String userEmail) {
        UserEntity userEntity = em.find(UserEntity.class, userEmail);
        TaskEntity taskEntity = new TaskEntity();
        taskEntity.setName(task.getName());
        taskEntity.setDescription(task.getDescription());
        taskEntity.setStatus(task.getStatus());
        taskEntity.setStatusDate(task.getDate());
        taskEntity = taskRepository.save(taskEntity)
        userEntity.getTasks().add(taskEntity);
        return taskEntity.getId();
    }

TaskRepository将在哪里

@Repository
public interface TaskRepository extends JpaRepository<TaskEntity, Integer>  
{  

}  
© www.soinside.com 2019 - 2024. All rights reserved.