【问题标题】:spring one-to-may annotation exceptionspring 一对一注释异常
【发布时间】:2020-02-27 20:38:00
【问题描述】:

我正在使用 spring-boot。

我有一个名为Datum 的类和一个名为User 的类。一个用户可以有很多数据。因此,从用户的角度来看,这种关系是一对多的。现在我想设计这些类。

这是我尝试过的:

public class Datum{
 ...
    @OneToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
    private User user;
 ...
}

还有:

public class User{
...
    @OneToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
    Set<Datum> data = new HashSet<>();//i have tried list-arrayList too
...
}

但这给了我org.hibernate.AnnotationException: Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements: 错误。

这里有什么问题?

【问题讨论】:

  • 不应该有像@ManyToOne这样的映射
  • 丹尼尔你能检查我的答案吗?
  • @ShaileshChandra 绝对正确,这解决了我的问题.. 非常感谢...

标签: spring spring-boot jpa spring-data-jpa h2


【解决方案1】:
public class Datum{
 ...
    @OneToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
    private User user;
 ...
}

这不是 OneToMany 关系。通过查看您的 User 类,这是一个 ManyToOne。

这样就可以了:

public class Datum {
 ...
    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private User user;
 ...
}

【讨论】:

    【解决方案2】:

    由于一个用户可以有很多数据,所以在用户类关系中会是这样的

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "user_id")
    private List<Datum> datums = new ArrayList<>()
    

    在Datum 类中不需要任何关系。

    【讨论】:

    • 两个错误 - javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory;嵌套异常是 org.hibernate.MappingException:
    • another - org.hibernate.MappingException: 无法确定类型:com.test.p.model.User,在表:基准,列:
    • 您收到错误是因为您没有在域类上使用@Entity 注释
    • @Danial 告诉我你的输出
    • 有来自@Entity的注释javax.persistence.*
    【解决方案3】:

    一对多的关系在另一方面是多对一。你应该这样映射它:

    public class Datum{
    ...
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "user_id")
        private User user;
    ...
    }
    

    还有:

    public class User{
    ...
        @OneToMany(
            mappedBy = "user",
            cascade = CascadeType.ALL,
            orphanRemoval = true
        )
        private Set<Datum> data = new HashSet<>();
    ...
    }
    

    如您所见,该关系在基准端是多对一的。此外,它应该有一个 FetchType.LAZY 来提高性能,如果不能是没有用户的 Datum,您还应该添加“orphanRemoval = true”。

    【讨论】:

      猜你喜欢
      • 2013-01-13
      • 1970-01-01
      • 1970-01-01
      • 2015-12-25
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      • 1970-01-01
      相关资源
      最近更新 更多