Как привязать объект сущности к локальному свойству @Transient?

Класс сущности EmployeeInfo

@Entity
@Table(name = "employeeinfo")
public class EmployeeInfo{

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "employeeId")
private String employeeId;
@Column(name = "firstName")
private String firstName;
@Column(name = "middleName")
private String middleName;
@Column(name = "lastName")
private String lastName;

......

}

Другой класс Entity ProjectTaskComments

@Entity
@Table(name = "projecttaskcomments")
public class ProjectTaskComments{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Long id;
    @Basic(optional = false)
    @Column(name = "comments")
    private String comments;

    @Basic(optional = false)
    @Column(name = "commentTime")
    @Temporal(TemporalType.TIMESTAMP)
    private Date commentTime;
    @Column(name = "fkCommentedBy")
    private Long fkCommentedBy;


    @Transient
    @JsonIgnoreProperties
    private EmployeeInfo commentedEmployee;
    @Transient
    @Autowired
    EmployeeInfoService employeeInfoService; 


   public EmployeeInfo getCommentedEmployee() {
        EmployeeInfo employeeInfo;
        employeeInfo = employeeInfoService.getSingleEmployeeInfoByFkUserId(this.fkCommentedBy);
        if(employeeInfo != null) {
            this.commentedEmployee.setEmployeeId(employeeInfo.getEmployeeId());
            this.commentedEmployee.setFirstName(employeeInfo.getFirstName());
            this.commentedEmployee.setMiddleName(employeeInfo.getMiddleName());
            this.commentedEmployee.setLastName(employeeInfo.getLastName());
            this.commentedEmployee.setPhoto(employeeInfo.getPhoto());
            return commentedEmployee;
        } else {
            return null;
        }
    }

}

Я попытался найти объект EmployeeInfo в методе getCommentedEmployee() по свойству fkCommentedBy и установить свойство @Transient commentedEmployee.

Я нашел следующие ошибки:

2018-10-11 13:07:56.834  WARN 16756 --- [nio-8081-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: (was java.lang.NullPointerException); nested exception is com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: java.util.ArrayList[1]->com.activeboss.model.pm.ProjectTasks["projecttaskcommentsCollection"]->org.hibernate.collection.internal.PersistentBag[0]->com.activeboss.model.pm.ProjectTaskComments["commentedEmployee"])
2018-10-11 13:07:56.853  WARN 16756 --- [nio-8081-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved exception caused by Handler execution: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: (was java.lang.NullPointerException); nested exception is com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: java.util.ArrayList[1]->com.activeboss.model.pm.ProjectTasks["projecttaskcommentsCollection"]->org.hibernate.collection.internal.PersistentBag[0]->com.activeboss.model.pm.ProjectTaskComments["commentedEmployee"])

Как мне это решить?


person Mujahid Khan    schedule 11.10.2018    source источник
comment
Похоже, вы пытаетесь автоматически связать компонент Spring в своем классе сущностей, что не сработает, поскольку экземпляр объекта не является управляемым компонентом Spring. Если вы заметите сообщение об исключении, вы увидите NPE, который, как я полагаю, вызван Null employeeInfoService.   -  person Kishore Kirdat    schedule 11.10.2018
comment
Объект найден, и я проверяю его, но не могу установить переменную свойства @Transient   -  person Mujahid Khan    schedule 11.10.2018
comment
Большое спасибо, я решаю это по вашей информации.   -  person Mujahid Khan    schedule 11.10.2018


Ответы (3)


Целью @Transient является моделирование непостоянного атрибута, поэтому мне непонятно, почему вы хотите использовать @Transient для атрибута commentedByEmployee, если он сохраняется через атрибут «fkCommentedBy». ИМО, @ManyToOne больше подходит в этом случае.

@Entity
@Table(name = "projecttaskcomments")
public class ProjectTaskComments {

// .... other declarations 
@ManyToOne
@JoinColumn(name="fkCommentedBy")
private EmployeeInfo commentedEmployee;
// ..... other code
}

Теперь, если вы все еще хотите использовать @Transient, то в методе получения вам нужно убедиться, что у вас есть действительный референт на объект EmployeeInfoService. @Autowired здесь не работает, так как ProjectTaskComments не является управляемым bean-компонентом Spring.

person Kishore Kirdat    schedule 11.10.2018
comment
Большое спасибо. Я решил это из вашей доброй информации - person Mujahid Khan; 11.10.2018

Согласитесь, @KishoreKirdat, нужно проверить значение null и выполнить некоторую инициализацию:

public EmployeeInfo getCommentedEmployee() {
  // check here
  if (employeeInfoService == null) return null;

  EmployeeInfo employeeInfo = employeeInfoService.getSingle...;
  if (employeeInfo != null) {
    // init here
    commentedEmployee = new EmployeeInfo();

    commentedEmployee.set...;
    return commentedEmployee;
  } else {
    return null;
  }
}

private void setCommentedEmployee(EmployeeInfo employeeInfo) {
  // do nothing
}
person RJ.Hwang    schedule 11.10.2018
comment
Также необходимо проверить значение null и выполнить некоторую инициализацию, следуя совету @KishoreKirdat. - person RJ.Hwang; 11.10.2018

Да, наконец-то я смог ее решить. Я только что сделал следующие работы:

  1. Добавлен @Component в класс ProjectTaskComments:

    @Entity    
    @Component    
    @Table(name = "projecttaskcomments")    
    public class ProjectTaskComments{
    ........
    
  2. Объявил EmployeeInfoService как статический и добавил метод установки для службы и @Autowired.

    @Transient
    private static EmployeeInfoService employeeInfoService;
    
    @Autowired
    public void setEmployeeInfoService(EmployeeInfoService employeeInfoService) {
        this.employeeInfoService = employeeInfoService;
    }
    
person Mujahid Khan    schedule 11.10.2018