如何将实体对象绑定到本地@Transient属性?

时间:2018-10-11 07:41:02

标签: java spring-boot spring-data-jpa fasterxml jackson-databind

EmployeeInfo实体类

${size}

}

另一个实体类ProjectTaskComments

@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;

......

我试图通过fkCommentedBy属性在getCommentedEmployee()方法中找到一个EmployeeInfo对象,并将其设置为@Transient属性commentedEmployee。

我发现了以下错误:

@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;
        }
    }

}

我该如何解决?

3 个答案:

答案 0 :(得分:1)

@Transient的目的是为非持久属性建模,因此我不清楚为什么要在通过“ fkCommentedBy”属性持久化commentedByEmployee属性时对@transient进行建模。 IMO,@ ManyToOne在这种情况下更合适。

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

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

现在,如果您仍然想使用@Transient,那么在getter方法中,需要确保您对EmployeeInfoService对象具有有效的引用。由于ProjectTaskComments不是spring托管的bean,因此@Autowired在这里不起作用。

答案 1 :(得分:0)

同意@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
}

答案 2 :(得分:0)

是的,最终我可以解决它。我刚刚做了以下工作:

  1. 在ProjectTaskComments类中添加了@Component:

    @Entity    
    @Component    
    @Table(name = "projecttaskcomments")    
    public class ProjectTaskComments{
    ........
    
  2. 将EmployeeInfoService声明为静态,并为该服务添加了一个seter方法,并对其进行@Autowired。

    @Transient
    private static EmployeeInfoService employeeInfoService;
    
    @Autowired
    public void setEmployeeInfoService(EmployeeInfoService employeeInfoService) {
        this.employeeInfoService = employeeInfoService;
    }