【问题标题】:Hibernate One to many Annotation MappingHibernate 一对多注释映射
【发布时间】:2015-08-20 10:53:30
【问题描述】:

您好,我有两张如下表。

1) 任务 - id,name 2) 资源 - id,name,defaultTask(Task.id 的外键)

映射是一对多的——一个任务可以有很多资源。

Task 的代码如下。

@Entity
public class Task implements Serializable {
private long m_id;
private String m_name;

@Id
@GeneratedValue(
    strategy = GenerationType.AUTO
)
public long getId() {
    return this.m_id;
}

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

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

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

@OneToMany
@JoinColumn(
    name = "defaultTask"
)
private List<Resource> m_relatedResources;

public List<Resource> getrelatedResources() {
    return m_relatedResources;
}


public void setrelatedResources(List<Resource> relatedResources) {
    m_relatedResources = relatedResources;
}

Resource 类的代码如下。

@Entity
public class Resource implements Serializable {
private Long m_id;
private String m_name;
@Id
@GeneratedValue(
    strategy = GenerationType.AUTO
)
public Long getId() {
    return this.m_id;
}

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

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

public void setName(String name) {
    this.m_name = name;
}
Task m_task;
@ManyToOne
@JoinColumn(
    name = "defaultTask"
)
public Task getTask() {
    return this.m_task;
}

public void setTask(Task task) {
    this.m_task = task;
}

}

当我执行它时,我收到一个类似的错误

初始 SessionFactory 创建失败。org.hibernate.MappingException:无法确定类型:java.util.List,列:[org.hibernate.mapping.Column(relatedResources)]

我做错了什么?我该如何解决这个问题?

【问题讨论】:

  • 你的问题已经通过实时工作解决了.. :-)

标签: java hibernate


【解决方案1】:

@JoinColumn 仅用于关系的所有者一侧,ToOne 一侧,在您的情况下为 Resource#task。另一方面,您应该使用mappedBy 属性来指定双向关系。将您的 Task#relatedResources 映射更改为此

@OneToMany(mappedBy = "task")
private List<Resource> m_relatedResources;

此外,正如@Viraj Nalawade 注意到的(显然还有其他人),映射注释应该在字段属性上,无论用于@Id 的内容都优先。将@Id 移至字段,或将@OneToMany 移至getter。

【讨论】:

    【解决方案2】:

    您不能将注释随机应用于方法或字段。通常,您应该以与@Id 相同的方式应用注释。

    在任务类 OneToMany 中应该是这样的

    @OneToMany
    @JoinColumn(
        name = "defaultTask"
    )
    public List<Resource> getrelatedResources() {
        return m_relatedResources;
    }
    

    字段访问策略(由@Id 注解确定)。将任何与 JPA 相关的注释放在每个方法的正上方,而不是字段/属性,因为您的 id 它在方法上方,它会让您摆脱异常。
    此外,@PredragMaric 提到的双向映射似乎也存在问题,因此您需要使用 MappedBy 来指示休眠关系的关键在另一侧。点击Mapped by 提出一个非常好的问题。

    【讨论】:

      【解决方案3】:

      您将注释字段和 getter 混合在同一个实体中,您应该将 @OneToMany 移动到 getter 中

      @OneToMany
      @JoinColumn(mappedBy = "task")
      public List<Resource> getrelatedResources() {
          return m_relatedResources;
      }
      

      是的,正如其他人提到的,它应该是mappedBy = "task"。我会赞成这个团队合作:)

      【讨论】:

        【解决方案4】:

        这里有很多错误:

        1. 您有时会注释字段,有时还会注释 getter。一半的注释将被忽略:你必须保持一致。这是其中之一。
        2. 您没有遵守 Java Bean 命名约定。 getter 必须是 getRelatedResources(),而不是 getrelatedResources()
        3. 双向关联必须具有所有者方和反向方。在 OneToMany 中,One 始终是反面。因此映射应该是:

        .

        @ManyToOne
        @JoinColumn(name = "defaultTask")
        public Task getTask() {
            return this.m_task;
        }
        

        @OneToMany(mappedBy = "task")
        public List<Resource> getRelatedResources() {
            return m_relatedResources;
        }
        

        我还强烈建议您尊重 Java 命名约定。变量应命名为idname,而不是m_idm_name。如果您选择注释字段,这一点尤其重要。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-06-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多