【问题标题】:bidirectional hibernate relationship双向休眠关系
【发布时间】:2009-06-24 14:14:48
【问题描述】:

我有一个使用休眠和以下实体的 Web 应用程序。 我做错了什么?

...
@Entity
public class Registration implements BaseEntity {
...
@OneToMany(cascade = {CascadeType.PERSIST}, mappedBy = "registration", fetch = FetchType.EAGER)
private List<OrderedProduct> orderedProducts = new ArrayList<OrderedProduct>();
...
public List<OrderedProduct> getOrderedProducts() {
    return orderedProducts;
}

public void setOrderedProducts(List<OrderedProduct> orderedProducts) {
    this.orderedProducts = orderedProducts;
}
...

...
@Entity
public class OrderedProduct implements BaseEntity {
...
@ManyToOne
@JoinColumn(name = "registration_id",nullable = true)
private Registration registration;
...
public Registration getRegistration() {
    return registration;
}
public void setRegistration(Registration registration) {
    this.registration = registration;
}
...

当我使用它时,我得到以下 Tomcat 错误:

Caused by: org.hibernate.AnnotationException: Illegal use of mappedBy on both sides of the relationship: at.irian.conference.domain.Registration.orderedProducts
    at org.hibernate.cfg.annotations.TableBinder.bindFk(TableBinder.java:193)
    at org.hibernate.cfg.annotations.CollectionBinder.bindCollectionSecondPass(CollectionBinder.java:1325)
    at org.hibernate.cfg.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1164)
    at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:602)
    at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:543)
    at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:66)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1163)
    at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:329)
    at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1148)
    at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1226)
    at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:173)
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:854)
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:425)
    at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:131)
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:221)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:251)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1288)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1257)
    ... 86 more

【问题讨论】:

  • 你们的关系是什么样的? Registration[1] -> [0..n]OrderProducts,你想双向映射它吗?
  • 一个注册有很多orderedProducts => 1:n

标签: java hibernate jpa


【解决方案1】:

这段代码是对的,我忘记删除其他关系了

【讨论】:

  • 如果问题不再开放,您应该接受此答案。
【解决方案2】:

使用 List 映射集合需要在数据库中映射一个“序列”列。你打算用作 Set 吗

【讨论】:

    【解决方案3】:

    我不确定使用注解的语法。我们曾经像下面这样定义这样的关系。

    Registration.hbm.xml

    <bag
        name="orderedProducts"
        inverse="true"
        cascade="appropriate-one"
    >
        <key>
            <column name="REGISTRATION_ID" />
        </key>
        <one-to-many 
            class="orderedProducts"
        />
    </bag>
    

    OrderedProducts.hbm.xml

    <many-to-one
        name="registration"
        class="Registration"
    >
        <column name="REGISTRATION_ID"/>
    </many-to-one>
    

    【讨论】:

      【解决方案4】:

      尝试如下注释。它会解决你的问题。

      @ManyToOne(fetch = FetchType.EAGER)
      
      @JoinColumn(name = "registration_id")
      
      public Registration getRegistration() {
          return registration;
      }
      
      public void setRegistration(Registration registration) {
          this.registration = registration;
      }
      
      @OneToMany(fetch = FetchType.EAGER, targetEntity = Registration.class, mappedBy = "registration", cascade = { CascadeType.ALL })
      @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
      @Fetch(FetchMode.SELECT)
      @JoinColumn(name = "registration_id")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-10
        • 2012-10-14
        • 2015-10-14
        • 2023-04-09
        • 1970-01-01
        • 2021-12-23
        • 2015-05-31
        • 1970-01-01
        相关资源
        最近更新 更多