【问题标题】:OneToOne Association In JPA not working using Spring boot and spring data JPAJPA 中的 OneToOne 关联无法使用 Spring Boot 和 Spring Data JPA
【发布时间】:2018-08-27 07:01:14
【问题描述】:

我正在尝试在 JPA 中实现 OneToOne 关联,并尝试使用 Spring Boot 和 Spring Data JPA 连接两个表。我创建了一个 Spring Boot 微服务并在我的模型中实现了一对一关联。但是当我运行代码时,出现以下错误,

Caused by: org.hibernate.AnnotationException: Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElement

这里我的第一个模型类Users.java如下,

@Entity
@Table(name = "users")
public class Users implements Serializable {

private static final long serialVersionUID = 9178661439383356177L;

@Id

@Column(name="user_id")
public Integer userId;

@Column(name="username")
public String username;

@Column(name="password")
public String password;


}

我正在使用以下代码通过控制器测试关联,

@GetMapping("/load")
    public Users load() {
        return (Users) userObj.findAll();
    }

谁能帮忙解决这个关联问题?

【问题讨论】:

  • 哪些文档告诉您在 Users 类型的单个值字段上使用 @OneToMany 是正确的?
  • 哪些文档告诉您在 List 类型的多值字段上使用 @OneToOne 是正确的?
  • 它不是多值类型。请检查我更新的问题。
  • 错误消息清楚地显示@OneToMany,并且在更改问题之前您有一个OneToMany。而现在你一个也没有。现在错误消息与问题无关。因此,如果您要重写问题,请打开一个新问题,而不是认为所有回答都是多余的

标签: spring-boot jpa model-associations


【解决方案1】:

这是错误的。

@OneToOne(mappedBy="nuserId")
public Set<UserRoleMapping> roleUserRoleMappingMappingJoin;
}

OneToOne 意味着只有一个对象..对吗?

有关映射理解,请参阅此内容。

https://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/collections.html#collections-persistent

【讨论】:

  • 是的。对于用户表中的每个用户,仅映射到用户角色映射表中的一个条目。所以在这里我认为是一对一的映射。你有没有得到我的联想,我是怎么想的。如果我走错了方向,请告诉我。
  • 看起来你想使用manytomany,这样如果mapping和mappedBy正确,将自动创建第三个表。让映射处理一切。见baeldung.com/hibernate-many-to-many
【解决方案2】:

注释@OneToOne 定义了与另一个实体的单值关联,在您的情况下,您将用户关联到一组 UserRoleMapping,而不是将其与该类的单个对象关联。使用@ManyToOne 注解

【讨论】:

  • 没有。对于 user 中的每个用户记录,在 userrolemapping 中都有相应的记录。所以我认为这是一对一的映射。如果我出错了,请告诉我。感谢您的回复。
  • 如果他使用 manytoone 也 public Set roleUserRoleMappingMappingJoin;这将是错误的,因为对于 manytoone 我们也应该只有单个对象。
  • 如果每个用户在 UserRoleMapping 中都有唯一的记录,那为什么要使用 Set?据我从表名了解到,它是不同表中用户和角色的关联,这种情况下需要使用@ManyToMany
【解决方案3】:

其实异常指的是无效的@OneToMany, @ManyToMany or @CollectionOfElement映射

这只能是

@OneToMany()
@JoinColumn(name="nuser_id" , referencedColumnName="nuserId")
public Users nuserId;

如果@OneToMany 关系有效,首先将其更改为

@OneToMany()
@JoinColumn(name="nuser_id" , referencedColumnName="nuserId")
public List<Users> users;

如果@OneToMany 关系无效有效,则将其更改为

@OneToOne()
@JoinColumn(name="nuser_id" , referencedColumnName="nuserId")
public Users users;

【讨论】:

  • 谢谢您的回复先生。但我仍然怀疑这个一对多。因为用户中的每条记录在用户角色映射中都有对应的记录。不太多。那么如何一对多呢?我没明白你的意思?
  • 您拥有一个与多个用户相关联的角色。例如。一个角色“用户”可能会有很多用户。
  • 没有。在我的情况下,我使用多租户模型应用程序。在一个租户中,一个用户只有一个角色。可能有不同,但仅限于另一个租户。不一样。我为每个租户都有单独的数据库。这里唯一的可能是一条记录仅映射到用户角色映射中的一条记录。我希望这就是我想说的。先生,请告诉我,
  • 我的回答是关于您的例外情况,而不是对您的技术问题/疑问的咨询。请参阅我的更新答案。
猜你喜欢
  • 2017-11-29
  • 1970-01-01
  • 2014-10-21
  • 1970-01-01
  • 2017-05-09
  • 2021-07-14
  • 2016-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多