2013-05-30 2 views
1

나는 내 엔터티 클래스 company.java에서 호출해야하는 메서드가 있습니다. 하지만 난 내 응용 프로그램을 실행할 때 엔티티 클래스의 해당 DAO 객체를 세례반하지 않았다 널 포인터 예외가 발생합니다 ..내 엔터티 클래스에서 DAO 클래스 autowire 싶어

어떻게 엔티티 클래스의 객체가

이 내 엔티티 클래스입니다 도와주세요 얻을 수 있습니다 ..

package com.salebuild.model; 

/** 
* Define a company. 
* 
* @author mseritan 
*/ 
@Entity 
@Table(name = "company", uniqueConstraints = {@UniqueConstraint(columnNames = "name")}) 
@XmlRootElement 
@XmlSeeAlso(value = ArrayList.class) 
public class Company implements PublishableIF, Serializable, PersistableIF, HistoryIF, AddressableIF { 
    private static final Logger log = LoggerFactory.getLogger(Company.class); 
    @Autowired 
     private CompanyDAO companyDAO; 

    // CONSTANTS ----------------------------------------------------------------------------------- 

    private static final long serialVersionUID = 1L; 

    // ATTRIBUTES ---------------------------------------------------------------------------------- 

    private Long id; 
    @NotBlank 
    private String name; 
    private String formerName; 
    private CorporateTitle topLevelExec; 
    private List<CompanySite> sites; 
    private List<CompanyAlias> aliases; 
    @NotNull 
    private Industry industry; 
    private Company parentCompany; 
    private String emailTopology; 
    @NotNull 
    private Double revenue; 

    @NotNull 
    private Long numberEmployees; 
    private CustomerType.Type customerType; 
    private Boolean recruiter = false; 
    private int publishState; 
    private CompanyStatus status; 
    private Boolean excludeCompany = false; 
    private CompanyType companyType; 
    private String salesifyCompanyId; 
    private CompanySiteType companySiteType; 
    private String websiteUrl; 
    private String sourceVendor; 
    private String notes; 
    private List<CompanySpecializedRanking> specializedList = new ArrayList<CompanySpecializedRanking>(); 
    @NotNull 
    private NAICSCode naicsCode; 
    @NotNull 
    private SICCode sicCode; 
    private Long version; 
    private List<Technology> technologies = new ArrayList<Technology>(); 
    private List<CompanyContact> contacts; 
    private String phoneNumber; 
    private String faxNumber; 
    private String email; 

    private User userCreated; 
    private Date dateCreated; 

    private User userLastModified; 
    private Date dateLastModified; 

    private User userLastResearcher; 
    private Date dateLastResearcher; 
    @NotBlank 
    private String street1; 
    private String street2; 
    private String street3; 
    private String city; 
    private String zipCode; 
    private State state; 
    private Country country; 
    private String specRankingListName; 
    private Integer specRankingRank; 
    private Integer specRankingYear; 
    private String modifiedCompanyName; 

    private String formattedRevenue; 
    private String formattedEmployeeSize; 
    private List<JobPostingRaw> unconfirmedTechnologies; 
    // ACESSORS ------------------------------------------------------------------------------------ 
    //getter setter for other fields // 
     this.specRankingYear = specRankingYear; 
    } 


    /** 
    * @param modifiedCompanyName 
    * 
    */ 
    @Column(name="modifiedCompanyName") 
    public String getModifiedCompanyName() { 
     return modifiedCompanyName; 
    } 

    public void setModifiedCompanyName(String modifiedCompanyName) { 
     if(modifiedCompanyName==null) 
      this.modifiedCompanyName=modifiedCompanyName; 
     else{ 
     this.modifiedCompanyName =companyDAO.updateCompanyName(modifiedCompanyName); 
     } 
    } 

    @Transient 
    public List<JobPostingRaw> getUnconfirmedTechnologies() { 
     return unconfirmedTechnologies; 
    } 

    public void setUnconfirmedTechnologies(
      List<JobPostingRaw> unconfirmedTechnologies) { 
     this.unconfirmedTechnologies = unconfirmedTechnologies; 
    } 



} 

내 DAO 클래스는 같다 -

package com.salebuild.dao; 

import com.salebuild.model.Company; 
import com.salebuild.model.search.EntitySearchCriteria; 
import com.salebuild.model.search.SortedResultsPage; 

import java.util.Collection; 
import java.util.List; 
import java.util.Set; 

public interface CompanyDAO extends CrudDAO<Company> { 
    Company findByNameOrAlias(String name); 

    List<Company> findBySearchTerm(String searchTerm, Integer start, Integer count); 

    // SortedResultsPage<Company> findPaged(EntitySearchCriteria criteria); 

    List<Long> findIds(EntitySearchCriteria criteria); 

    List<Company> find(Collection<Long> ids); 

    /** 
    * For just finding the company name and not looking for alias names. 
    * 
    * @param name 
    * @return 
    */ 
    public Company findByName(String name); 
    public Company findByModifiedName(String name,Company... c); 

    public int companyCountSinceLastLogin(Long id); 

    Set<Long> findDistinctIds(EntitySearchCriteria criteria); 

    public Integer getCompanyCountByRegion(Long regionId,List techCatIds); 

    List<Company> findAllCompanies(Company instance); 

    public List<Company> findAllModifiedCompanies(Company instance); 

    public String updateCompanyName(String name); 
} 
+0

이것은 잘못된 디자인입니다. 왜 당신은 Entity 클래스 내에 DAO를 주입하고 있습니까? – dimitrisli

+0

나는 modifiedcompnyname을 설정하기 위해 DAO 클래스에서 sql 함수를 호출해야합니다. 이 작업을 수행하는 다른 방법을 제안하십시오 – shitanshu

+0

@shitanshu 귀하의 질문에 대한 귀하의 실제 요구 사항을 수정할 수 있습니까? 또한, 왜 당신은 단순히'createNativeQuery'를 통해 DAO의 메소드 내부에 함수를 invoque하지 않습니까? – fGo

답변

2

가장 쉬운 옵션은 엔티티를 구축하기위한 공장을 구현하는 것입니다. 그런 다음 종속성을 autowire하기 위해 AutowireCapableBeanFactory를 사용할 수 있습니다

public abstract class GenericFactory<T> { 

    @Autowired 
    private AutowireCapableBeanFactory autowireBeanFactory; 

    public T createBean() { 
    // creation logic 
    autowireBeanFactory.autowireBean(createdBean); 
    return createdBean; 
    } 
} 

물론 당신은 객체를 (만들거나 검색) 통과 그냥 autowire하기 수 있습니다.

또 다른 옵션은 @Configurable을 사용하는 것입니다. 자동으로 종속성을 주입합니다. http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-atconfigurable

당신은 내 게시물에서 자세한 내용을 찾을 수 있습니다

: http://www.kubrynski.com/2013/09/injecting-spring-dependencies-into-non.html

0

JPA 엔티티는 POJO를 즉 종속성이 더 복잡한 논리를 포함하지 getter 및 setter가없는 간단한 자바 콩으로 의미가있다.

코드 전체에서 사용되는 엔티티를 저장하고 업데이트하는 서비스를 만드는 것이 좋습니다. 이 서비스는 autowired 될 수있는 의존성을 사용하여 세터에 넣고 자하는 로직을 실행하는 역할을합니다.

문제는 Spring이 엔티티 생성에 책임이 없다는 것입니다. new을 사용하여 인스턴스화하거나 JPA 구현에서 가져옵니다. 어쨌든 Spring이 선언 된 의존성을 autowire 할 기회는 없습니다.


개인 변수를 autowire하는 것은 좋지 않습니다. 자세한 내용은 blog post을 참조하십시오.

+0

이 생각에 따르면 Active Record 엔티티의 일부는 도메인 기반 디자인에 유용합니다. – MariuszS

+0

서비스에서 개인 변수를 Autowiring하는 것은 나쁜 생각이지만 엔터티에서는 적절한 방법입니다. – MariuszS

+0

도메인 기반 디자인에 대해 읽어야합니다. 모든 비즈니스 로직은 엔터티에 저장되어 있으며 직접 "빈혈 엔터티"로 설명됩니다. 반 패턴으로 처리됩니다. –

관련 문제