首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@ Spring和Hibernate3的可嵌入问题

@ Spring和Hibernate3的可嵌入问题
EN

Stack Overflow用户
提问于 2013-06-01 06:46:40
回答 1查看 495关注 0票数 0

我在映射实体以使用@Embeddable类作为联接类代表来实现多到多连接表时遇到了问题。基本上,这就是我想要达到的目标:

我遵循了Java持久性书中提供的教程,并且仍然收到来自以下方法的错误:

nz.co.doltech.ims.project.server.entities.CategoryEntity.incidentCategoryJoinsnz.co.doltech.ims.project.server.entities.IncidentCategoryJoin :使用@OneToMany或@ManyToMany,目标是未映射的类: org.hibernate.cfg.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1185) at org.hibernate.cfg.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1185) at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:710) at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:645) at org。hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:65) at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1716) at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1423) at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1375) at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:720) at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:188)在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1541) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1479)

我正在使用spring设置hibernate:

org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean

Spring Appcontext.xml:

代码语言:javascript
复制
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
            http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
            http://www.springframework.org/schema/tx
            http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
            http://www.springframework.org/schema/aop 
            http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-3.0.xsd">

  <tx:annotation-driven transaction-manager="transactionManager" />
  <context:annotation-config />
  <context:component-scan base-package="nz.co.doltech.ims" />
  <aop:aspectj-autoproxy />

  <!-- Configurer that replaces ${...} placeholders with values from a properties file -->
  <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
      <list>
         <value>classpath:nz/co/doltech/ims/paths.properties</value>
         <value>classpath:nz/co/doltech/ims/project/project.properties</value>
         <value>classpath:nz/co/doltech/ims/framework/framework.properties</value>
      </list>
    </property>
    <property name="ignoreResourceNotFound" value="no"/>
  </bean>

  <!-- Hibernate Data Source -->
  <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${project.database.driver}" />
    <property name="url" value="${project.database.url}" />
    <property name="username" value="${project.database.user}" />
    <property name="password" value="${project.database.password}" />
  </bean>

  <!-- Hibernate SessionFactory -->
  <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"><!-- depends-on="flyway" -->
    <!-- property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /-->
    <property name="dataSource">
      <ref bean="dataSource" />
    </property>
    <property name="packagesToScan">
      <list>
        <value>${paths.project}.server.entities</value>
      </list>
    </property>
    <property name="hibernateProperties">
      <props>
        <prop key="hibernate.dialect">${project.hibernate.dialect}</prop>
        <prop key="hibernate.show_sql">${project.hibernate.show_sql}</prop>
        <prop key="hibernate.hbm2ddl.auto">${project.hibernate.hbm2ddl}</prop>
        <prop key="javax.persistence.validation.mode">none</prop>
      </props>
    </property>
  </bean>

  <!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
  <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
  </bean>

  <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory" />
  </bean>

</beans>

下面是我带注释的实体类

CategoryEntity.java:

代码语言:javascript
复制
@javax.persistence.Entity
@Table(name = "categories")
public class CategoryEntity implements Entity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(unique = true, nullable = false)
    private int id = Entity.UNSAVED_ID;

    @Basic(optional = false)
    @Column(nullable = false, length = 128)
    private String name;

    @Basic(optional = false)
    @Column(nullable = false, length = 512)
    private String description;

    @OneToMany(mappedBy = "category")
    private Set<IncidentCategoryJoin> incidentCategoryJoins;

    @JoinTable(
        name = "category_categorytype",
        joinColumns = @JoinColumn(name = "category_id")
    )
    private Set<CategoryTypeJoin> categoryTypeJoins;

    // id column
    @Override
    public int getId() {
        return this.id;
    }
    public void setId(int id) {
        this.id = id;
    }

    // name column
    public String getName() {
        return this.name;
    }
    public void setName(String name) {
        this.name = name;
    }

    // description column
    public String getDescription() {
        return this.description;
    }
    public void setDescription(String description) {
        this.description = description;
    }

    // incident join columns
    public Set<IncidentCategoryJoin> getIncidentCategoryJoins() {
        return incidentCategoryJoins;
    }
    public void setIncidentCategoryJoins(Set<IncidentCategoryJoin> 
        incidentCategoryJoins) {
        this.incidentCategoryJoins = incidentCategoryJoins;
    }

    // category type join columns
    public Set<CategoryTypeJoin> getCategoryTypeJoins() {
        return categoryTypeJoins;
    }
    public void setCategoryTypeJoins(Set<CategoryTypeJoin> categoryTypeJoins) {
        this.categoryTypeJoins = categoryTypeJoins;
    }
}

IncidentsEntity.java:

代码语言:javascript
复制
@javax.persistence.Entity(name = "incidents")
public class IncidentEntity implements Entity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(unique = true, nullable = false)
    private int id = Entity.UNSAVED_ID;

    @Basic
    private String owner;

    @Column(length = 256)
    private String description;

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

    @Column(length = 128)
    private String title;

    @Column(length = 20)
    private String date;

    @Column(name="location_details", length = 512)
    private String locationDetails;

    @Column(name="authorities_involved", length = 512)
    private String authInvolved;

    private int status;
    private int state;

    @Column(name="sub_state")
    private int subState;

    @Column(name="reported_by")
    private int reportedBy;

    @JoinTable(
        name = "incident_category",
        joinColumns = @JoinColumn(name = "incident_id")
    )
    @Embedded
    private Set<IncidentCategoryJoin> incidentCategoryJoins;

    // id column
    @Override
    public int getId() {
        return this.id;
    }
    public void setId(int id) {
        this.id = id;
    }

    // description column
    public String getDescription() {
        return this.description;
    }
    public void setDescription(String description) {
        this.description = description;
    }

    // owner column
    public String getOwner() {
        return this.owner;
    }
    public void setOwner(String owner) {
        this.owner = owner;
    }

    // creation date column
    public String getCreationDate() {
        return this.creationDate;
    }
    public void setCreationDate(String creationDate) {
        this.creationDate = creationDate;
    }

    // title column
    public String getTitle() {
        return this.title;
    }
    public void setTitle(String title) {
        this.title = title;
    }

    // date column
    public String getDate() {
        return this.date;
    }
    public void setDate(String date) {
        this.date = date;
    }

    // location details column
    public String getLocationDetails() {
        return locationDetails;
    }
    public void setLocationDetails(String locationDetails) {
        this.locationDetails = locationDetails;
    }

    // authorities involved column
    public String getAuthInvolved() {
        return authInvolved;
    }
    public void setAuthInvolved(String authInvolved) {
        this.authInvolved = authInvolved;
    }

    // status column
    public int getStatus() {
        return status;
    }
    public void setStatus(int status) {
        this.status = status;
    }

    // state column
    public int getState() {
        return state;
    }
    public void setState(int state) {
        this.state = state;
    }

    // sub state column
    public int getSubState() {
        return subState;
    }
    public void setSubState(int subState) {
        this.subState = subState;
    }

    // reported by column
    public int getReportedBy() {
        return reportedBy;
    }
    public void setReportedBy(int reportedBy) {
        this.reportedBy = reportedBy;
    }

    // categories join columns
    public Set<IncidentCategoryJoin> getIncidentCategoryJoins() {
        return incidentCategoryJoins;
    }
    public void getIncidentCategoryJoins(Set<IncidentCategoryJoin> 
        incidentCategoryJoins) {
        this.incidentCategoryJoins = incidentCategoryJoins;
    }
}

CategoryTypeEntity.java:

代码语言:javascript
复制
@javax.persistence.Entity
@Table(name = "categorytypes")
public class CategoryTypeEntity implements Entity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id = Entity.UNSAVED_ID;

    @Basic(optional = false)
    @Column(nullable = false, length = 128)
    private String name;

    @Basic(optional = false)
    @Column(nullable = false, length = 512)
    private String description;

    @OneToMany(mappedBy = "categoryType")
    private Set<CategoryTypeJoin> categoryTypeJoins;

    @OneToMany(mappedBy = "categoryType")
    private Set<IncidentCategoryJoin> incidentCategoryJoins;

    @Override
    public int getId() {
        return this.id;
    }
    public void setId(int id) {
        this.id = id;
    }

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

    public String getDescription() {
        return this.description;
    }
    public void setDescription(String description) {
        this.description = description;
    }

    public Set<CategoryTypeJoin> getCategoryTypeJoins() {
        return categoryTypeJoins;
    }
    public void setCategoryTypeJoins(Set<CategoryTypeJoin>
        categoryTypeJoins) {
        this.categoryTypeJoins = categoryTypeJoins;
    }
}

因此,我将使用@Embeddable注释将这些表连接起来,这样hibernate就可以将其映射到实体中。但是,正如您在错误消息中所看到的,它根本不是映射。

IncidentCategoryJoin.java:

代码语言:javascript
复制
@Embeddable
public class IncidentCategoryJoin implements Serializable {

    @Parent // Optional back-pointer
    private IncidentEntity incident;

    @ManyToOne
    @JoinColumn(name="category_id",
        insertable = false,
        updatable = false)
    private CategoryEntity category;

    @ManyToOne
    @JoinColumn(name="categorytype_id",
        insertable = false,
        updatable = false)
    private CategoryTypeEntity categoryType;

    public IncidentCategoryJoin() {}

    public IncidentCategoryJoin(
            IncidentEntity incident,
            CategoryEntity category,
            CategoryTypeEntity categoryType) {
        // Set fields
        this.incident = incident;
        this.category = category;
        this.categoryType = categoryType;

        // Guarantee referential integrity
        incident.getIncidentCategoryJoins().add(this);
        category.getIncidentCategoryJoins().add(this);
    }

    public IncidentEntity getIncident() {
        return incident;
    }
    public void setIncident(IncidentEntity incident) {
        this.incident = incident;
    }

    public CategoryEntity getCategory() {
        return category;
    }
    public void setCategory(CategoryEntity category) {
        this.category = category;
    }

    public CategoryTypeEntity getCategoryType() {
        return categoryType;
    }
    public void setCategoryType(CategoryTypeEntity categoryType) {
        this.categoryType = categoryType;
    }

    public boolean equals(Object o) {
        if (o != null && o instanceof IncidentCategoryJoin) {
            IncidentCategoryJoin that = (IncidentCategoryJoin)o;
            return this.category.equals(that.getCategory()) &&
                this.incident.equals(that.getIncident()) &&
                this.categoryType.equals(that.getCategoryType());
        } else {
            return false;
        }
    }

    public int hashCode() {
        return category.getId() + incident.getId() + categoryType.getId();
    }
}

CategoryTypeJoin.java:

代码语言:javascript
复制
@Embeddable
public class CategoryTypeJoin implements Serializable {

    @Parent // Optional back-pointer
    private CategoryEntity category;

    @ManyToOne
    @JoinColumn(name="categorytype_id",
        insertable = false,
        updatable = false)
    private CategoryTypeEntity categoryType;

    public CategoryTypeJoin() {}

    public CategoryTypeJoin(
            CategoryEntity category,
            CategoryTypeEntity categoryType) {
        // Set fields
        this.category = category;
        this.categoryType = categoryType;

        // Guarantee referential integrity
        category.getCategoryTypeJoins().add(this);
        categoryType.getCategoryTypeJoins().add(this);
    }

    public CategoryEntity getCategory() {
        return category;
    }
    public void setCategory(CategoryEntity category) {
        this.category = category;
    }

    public CategoryTypeEntity getCategoryType() {
        return categoryType;
    }
    public void setCategoryType(CategoryTypeEntity categoryType) {
        this.categoryType = categoryType;
    }

    public boolean equals(Object o) {
        if (o != null && o instanceof IncidentCategoryJoin) {
            IncidentCategoryJoin that = (IncidentCategoryJoin)o;
            return this.category.equals(that.getCategory()) &&
                this.categoryType.equals(that.getCategoryType());
        } else {
            return false;
        }
    }

    public int hashCode() {
        return category.getId() + categoryType.getId();
    }
}

有没有人知道为什么这不适合我?记住,我遵循了官方Java持久化书中的这种方法,所以理论上它对我来说应该很好。我一直在考虑在Spring或hibernate中出现bug的可能性。不管怎么说,我很感激能帮我的忙。

干杯,本·多尔

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-01 07:16:18

呃,不,这不是映射多少个关联的问题。不应将联接表映射为实体。你应该只有三个实体:

事件<->类别<-> CategoryType

连接表应该仅用于映射多到多个关联,在正式文件中将进行描述。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16869936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档