【问题标题】:many to one relationship in spring hibernate jpa春季休眠jpa中的多对一关系
【发布时间】:2014-01-24 17:47:19
【问题描述】:

谁能告诉我如何解决在 MySQL 数据库之上使用 hibernate 和 jpa 的 spring mvc 应用程序中的以下错误?

[javax.el.PropertyNotFoundException: Property 'facilities' not found on type   
org.springframework.samples.knowledgemanager.model.ProviderCompany] with root cause
javax.el.PropertyNotFoundException: Property 'facilities' not found on type  
org.springframework.samples.knowledgemanager.model.ProviderCompany

创建底层表的sql是:

CREATE TABLE IF NOT EXISTS providerCompanies(
  id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(80),
  INDEX(name)
);

CREATE TABLE IF NOT EXISTS facilityAddresses(
  id int(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  company_id int(11) UNSIGNED NOT NULL,
  type_id int(11) UNSIGNED NOT NULL,
  facilityname varchar(50),
  address varchar(200),
  city varchar(200),
  state_id int(11) UNSIGNED NOT NULL,
  zip varchar(50),
  isHQ bool,
  FOREIGN KEY (company_id) REFERENCES providerCompanies(id), 
  FOREIGN KEY (type_id) REFERENCES locationTypes(id),
  FOREIGN KEY (state_id) REFERENCES states(id)

);

ProviderCompany 类是:

@Entity
@Table(name = "providerCompanies")
public class ProviderCompany extends NamedEntity {
    @ManyToMany(cascade = {CascadeType.ALL})
    @JoinTable(name="companyContactJunction",
            joinColumns={@JoinColumn(name="company_id")},
            inverseJoinColumns={@JoinColumn(name="contact_id")})
    protected Set<OfficeContact> companycontacts = new HashSet<OfficeContact>();

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "company",  fetch=FetchType.EAGER)
    protected Set<FacilityAddress> facilities = new HashSet<FacilityAddress>();

    ////////////OfficeContact methods
    protected void setContactsInternal(Set<OfficeContact> locs) {this.companycontacts = locs;}

    protected Set<OfficeContact> getContactsInternal() {
        if (this.companycontacts == null) {this.companycontacts = new HashSet<OfficeContact>();}
        return this.companycontacts;
    }

    public List<OfficeContact> getContacts() {
        List<OfficeContact> sortedLocs = new ArrayList<OfficeContact>(getContactsInternal());
        PropertyComparator.sort(sortedLocs, new MutableSortDefinition("contact", true, true));
        return Collections.unmodifiableList(sortedLocs);
    }

    public void addContact(OfficeContact oc) {
        getContactsInternal().add(oc);
        oc.addCompany(this);
    }

    public OfficeContact getContact(String fa) {return getContact(fa, false);}

    public OfficeContact getContact(String fa, boolean ignoreNew) {
        fa = fa.toLowerCase();
        for (OfficeContact e : getContactsInternal()) {
            if (!ignoreNew || !e.isNew()) {
                String compName = e.getLastName();
                compName = compName.toLowerCase();
                if (compName.equals(fa)) {return e;}
            }
        }
        return null;
    }
    ////////////Location methods
    protected void setFacilitiesInternal(Set<FacilityAddress> addresses) {this.facilities = addresses;}

    protected Set<FacilityAddress> getFacilitiesInternal() {
        if (this.facilities == null) {this.facilities = new HashSet<FacilityAddress>();}
        return this.facilities;
    }

    public List<FacilityAddress> getFacilities() {
        List<FacilityAddress> sortedLocations = new ArrayList<FacilityAddress>(getFacilitiesInternal());
        PropertyComparator.sort(sortedLocations, new MutableSortDefinition("location", true, true));
        return Collections.unmodifiableList(sortedLocations);
    }

    public void addFacility(FacilityAddress addr) {
        getFacilitiesInternal().add(addr);
        addr.setCompany(this);
    }

    public FacilityAddress getFacility(String address) {return getFacility(address, false);}

    public FacilityAddress getFacility(String addr, boolean ignoreNew) {
        addr = addr.toLowerCase();
        for (FacilityAddress address1 : getFacilitiesInternal()) {
            if (!ignoreNew || !address1.isNew()) {
                String compName = address1.getAddress();
                compName = compName.toLowerCase();
                if (compName.equals(addr)) {return address1;}
            }
        }
        return null;
    }
}

FacilityAddress 类是:

@Entity
@Table(name = "facilityAddresses")
public class FacilityAddress extends BaseEntity{
    @Column(name="address")
    protected String address;

    @Column(name="city")
    protected String city;

    @ManyToOne
    @JoinColumn(name = "state_id")
    protected State state;

    @Column(name="zip")
    protected String zip;

    @ManyToOne
    @JoinColumn(name = "company_id")
    protected ProviderCompany company;

    @ManyToOne
    @JoinColumn(name = "type_id")
    protected LocationType locationType;

    @Column(name = "facilityname")
    protected String facilityname;

    @Column(name = "isHQ")
    protected boolean isHQ;

    @ManyToMany(mappedBy="facilities")
    protected Set<Provider> providers = new HashSet<Provider>();

    public String getAddress(){return address;}
    public void setAddress(String addr){address=addr;}

    public String getCity(){return city;}
    public void setCity(String cty){city=cty;}

    public State getState(){return this.state;}
    public void setState(State st){state=st;}

    public String getZip(){return zip;}
    public void setZip(String zp){zip=zp;}

    protected void setCompany(ProviderCompany pc) {this.company = pc;}
    public ProviderCompany getCompany(){return this.company;}

    public LocationType getLocationType(){return locationType;}
    public void setLocationType(LocationType lt){locationType=lt;}

    public String getFacilityname(){return facilityname;}
    public void setFacilityname(String dir){facilityname=dir;}

    public boolean getIsHQ(){return isHQ;}
    public void setIsHQ(boolean ma){isHQ=ma;}

    public void addProvider(Provider p) {providers.add(p);}
    public Set<Provider> getProviders(){return this.providers;}

    public boolean isNew() {return (this.id == null);}
}

这里是BaseEntity.java

@MappedSuperclass
public class BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected Integer id;

    public void setId(Integer id) {this.id = id;}

    public Integer getId() {return id;}

    public boolean isNew() {return (this.id == null);}

}

这里是NamedEntity.java

@MappedSuperclass
public class NamedEntity extends BaseEntity {

    @Column(name = "name")
    private String name;

    public void setName(String name) {this.name = name;}

    public String getName() {return this.name;}

    @Override
    public String toString() {return this.getName();}

}

JpaProviderCompanyRepository 是:

@Repository
public class JpaProviderCompanyRepositoryImpl implements ProviderCompanyRepository {

    @PersistenceContext
    private EntityManager em;

    @SuppressWarnings("unchecked")
    public Collection<ProviderCompany> findByName(String name) {
        System.out.println("---------------------- inside findByName() ");
        Query query = this.em.createQuery("SELECT DISTINCT company FROM ProviderCompany company left join fetch company.facilities WHERE company.name LIKE :name");
        System.out.println("---------------------- just created query. ");
        query.setParameter("name", name + "%");
        System.out.println("---------------------- just set parameter for query. ");
        Collection<ProviderCompany> results = query.getResultList();
        System.out.println("---------------------- just stored query results in collection. ");
        return results;//query.getResultList();
    }

    @Override
    public ProviderCompany findById(int id) {
        // using 'join fetch' because a single query should load both owners and pets
        // using 'left join fetch' because it might happen that an owner does not have pets yet
        System.out.println("<<<<<<<<<<<<<<<<<<<<<<<< inside Jpa Repository findById() >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
        Query query = this.em.createQuery("SELECT company FROM ProviderCompany company left join fetch company.facilities WHERE company.id =:id");
        System.out.println("========================= Just set query. ");
        query.setParameter("id", id);
        System.out.println("------------------------- Just added parameter to query. ");
        ProviderCompany pc = (ProviderCompany) query.getSingleResult();
        System.out.println("------------------------- Just created ProviderCompany object from query result. ");
        return pc;
    }

    @Override
    public void save(ProviderCompany company) {
        if (company.getId() == null) {this.em.persist(company);}
        else {this.em.merge(company);}
    }
}

完整的堆栈跟踪是:

Jan 24, 2014 11:10:12 AM org.apache.catalina.core.ApplicationDispatcher invoke
SEVERE: Servlet.service() for servlet jsp threw exception
javax.el.PropertyNotFoundException: Property 'facilities' not found on type org.springframework.samples.knowledgemanager.model.ProviderCompany
    at javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:237)
    at javax.el.BeanELResolver$BeanProperties.access$400(BeanELResolver.java:214)
    at javax.el.BeanELResolver.property(BeanELResolver.java:325)
    at javax.el.BeanELResolver.getValue(BeanELResolver.java:85)
    at org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:104)
    at org.apache.el.parser.AstValue.getValue(AstValue.java:183)
    at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:185)
    at org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:1026)
    at org.apache.jsp.WEB_002dINF.jsp.companies.companiesList_jsp._jspService(companiesList_jsp.java:327)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:749)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:487)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:412)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:339)
    at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)
    at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:263)
    at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1208)
    at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:992)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:939)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at com.github.dandelion.datatables.core.web.filter.DatatablesFilter.doFilter(DatatablesFilter.java:73)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at com.github.dandelion.datatables.extras.servlet2.filter.DatatablesFilter.doFilter(DatatablesFilter.java:71)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Jan 24, 2014 11:10:12 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [KnowledgeManager] in context with path [/knowledgemanager] threw exception [javax.el.PropertyNotFoundException: Property 'facilities' not found on type org.springframework.samples.knowledgemanager.model.ProviderCompany] with root cause
javax.el.PropertyNotFoundException: Property 'facilities' not found on type org.springframework.samples.knowledgemanager.model.ProviderCompany
    at javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:237)
    at javax.el.BeanELResolver$BeanProperties.access$400(BeanELResolver.java:214)
    at javax.el.BeanELResolver.property(BeanELResolver.java:325)
    at javax.el.BeanELResolver.getValue(BeanELResolver.java:85)
    at org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:104)
    at org.apache.el.parser.AstValue.getValue(AstValue.java:183)
    at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:185)
    at org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:1026)
    at org.apache.jsp.WEB_002dINF.jsp.companies.companiesList_jsp._jspService(companiesList_jsp.java:327)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:749)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:487)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:412)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:339)
    at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)
    at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:263)
    at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1208)
    at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:992)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:939)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at com.github.dandelion.datatables.core.web.filter.DatatablesFilter.doFilter(DatatablesFilter.java:73)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at com.github.dandelion.datatables.extras.servlet2.filter.DatatablesFilter.doFilter(DatatablesFilter.java:71)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)

【问题讨论】:

  • 错误信息很清楚:实体ProviderCompany中没有locations属性,所以你的JPQL查询是错误的。你期待什么?
  • @DavidLevesque 感谢您第一个看到错字。我已将locations 更改为facilities。我刚刚对上面的代码进行了更改,它揭示了真正的错误。你能帮我解决吗?我已经看了几天了,无法弄清楚。
  • 它似乎在表facilityAddresses 中找不到address 列。您确定您的数据库架构是最新的并且您正在连接到正确的数据库吗?
  • @DavidLevesque 再次感谢您提供非常有见地的回答。我在创建数据库的 sql 中添加了 DROP TABLE IF EXISTS facilityAddresses; 并发现了一个新错误,我在上面的原始帖子的编辑版本中编写了该错误。你愿意帮我解决这个问题吗?我尽量不就这个问题发布多个问题,而且我已经研究这个问题好几天了。

标签: java mysql spring hibernate jpa


【解决方案1】:

我在 ProviderCompany 中没有看到 facilities 属性的任何设置器。尝试添加setFacilities() 方法。

【讨论】:

  • 做到了。 +1 并感谢您在上面的多个 cmets 以及您在此处的回答中提供的所有帮助。
  • 我有一个非常相似的问题,只有多对多关系,我需要一个选择框来填充实体的所有可能值的列表,用户从中选择一个小数字的值。我从这个问题中尝试了你的建议,但它不起作用。你能看看我的新问题吗?链接在这里:stackoverflow.com/questions/21444612/…
【解决方案2】:

我认为这个错误与 JPA 无关。从堆栈跟踪来看,这里的问题是 Spring MVC 无法识别有问题的属性。为了被 Spring MVC 识别为属性,变量必须具有 javabeans 样式的 getter 和 setter。重新检查您的代码后,我发现您缺少 facilities 变量的设置器,Spring MVC 需要这样做才能为变量赋值。

也许可以自定义它,这样您就不必添加您并不真正想要的设置器,但我不知道如何。我最不喜欢 Spring MVC 的一件事是它对与之通信的类的要求,这些类通常是域类,你希望尽可能保持干净的类,其中要求由域逻辑控制,而不是第三者。为每个页面使用单独的命令对象可能会缓解这种情况,但另一方面它也可能会变得混乱......

总的来说,恕我直言,您有很多混乱,例如 @Column-annotations 只是将列的名称定义为 JPA 默认使用的名称。这些可以删除(以及名称为_id的@JoinColumns,也是默认值。)此外,过度使用特殊字符有点伤害我的眼睛:p

【讨论】:

  • +1 感谢您看到这个问题。同时看到该问题的其他人也帮助解答了该线程先前迭代的答案。
【解决方案3】:

这是因为您的ProviderCompany 及其超类没有locations 字段。所以你不能在查询中使用这个不存在的字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 2013-01-11
    相关资源
    最近更新 更多