Java 使用@OneToMany或@ManyToMany针对列表的未映射类<;字符串>;春季数据jpa

Java 使用@OneToMany或@ManyToMany针对列表的未映射类<;字符串>;春季数据jpa,java,spring,spring-boot,hibernate,hibernate-mapping,Java,Spring,Spring Boot,Hibernate,Hibernate Mapping,我正在尝试使用Crudepository实现Spring数据jpa。 下面是我的实体类 public class User { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id = null; @OneToMany @ElementCollection @CollectionTable(name="photoUrls") @Valid private List&

我正在尝试使用Crudepository实现Spring数据jpa。 下面是我的实体类

public class User {
  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  private Long id = null;

  @OneToMany
  @ElementCollection
  @CollectionTable(name="photoUrls")
  @Valid
  private List<String> photoUrls = new ArrayList<String>();

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }
  public List<String> getPhotoUrls() {
    return photoUrls;
  }

  public void setPhotoUrls(List<String> photoUrls) {
    this.photoUrls = photoUrls;
  }

}
公共类用户{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私有长id=null;
@独身癖
@元素集合
@CollectionTable(name=“photoUrls”)
@有效的
私有列表photoURL=new ArrayList();
公共长getId(){
返回id;
}
公共无效集合id(长id){
this.id=id;
}
公共列表getPhotoUrls(){
返回照片URL;
}
公共void setphotoURL(列出photoURL){
this.photoUrls=photoUrls;
}
}
并有一个存储库,如下所示

public interface UserRepository extends CrudRepository<User, Long>{
  
}
public interface UserRepository扩展了crudepository{
}
并尝试使用h2数据库进行本地测试

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>

com.h2数据库
氢
运行时
从CommandLineRunner调用UserRepository的save方法,但出现以下错误

原因:org.hibernate.AnnotationException:使用@OneToMany或@ManyToMany瞄准未映射的类:model.User.photoUrls[java.lang.String] 在org.hibernate.cfg.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1191)~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 在org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:794)~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]


Hibernate支持三种数据映射类型:基本(例如字符串、int)、可嵌入和实体。通常,数据库行映射到一个实体,每个数据库列都与一个基本属性相关联。当将多个字段映射组合到一个可重用的组中时(可嵌入的被合并到拥有的实体映射结构中),可嵌入类型更常见

基本类型和可嵌入项都可以通过
@ElementCollection
在一个实体多个非实体关系中关联到一个实体

  @ElementCollection
  @CollectionTable(name="photoUrls",
                   joinColumns = @JoinColumn(name =  "user_id"))
  @Valid
  private List<String> photoUrls = new ArrayList<String>();
在上面的代码中,Photo是一个实体

有关更多信息,请参阅以下链接:

您没有使用实体模型来存储照片URL

@ElementCollection注释用于将值列表存储为实体属性,而无需对其他实体建模


因此,您需要删除@OneToMany。

您不需要
@OneToMany
@ManyToOne
@OneToOne
@ManyToMany
注释,除非表之间存在关系,否则请删除
@OneToMany
,因为在您的情况下没有关系

public class User {
      @Id
      @GeneratedValue(strategy=GenerationType.AUTO)
      private Long id = null;
    
      @ElementCollection
      @CollectionTable(name="photoUrls")
      @Valid
      private List<String> photoUrls = new ArrayList<String>();
    
      public Long getId() {
        return id;
      }
    
      public void setId(Long id) {
        this.id = id;
      }
      public List<String> getPhotoUrls() {
        return photoUrls;
      }
    
      public void setPhotoUrls(List<String> photoUrls) {
        this.photoUrls = photoUrls;
      }
    
    }
公共类用户{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私有长id=null;
@元素集合
@CollectionTable(name=“photoUrls”)
@有效的
私有列表photoURL=new ArrayList();
公共长getId(){
返回id;
}
公共无效集合id(长id){
this.id=id;
}
公共列表getPhotoUrls(){
返回照片URL;
}
公共void setphotoURL(列出photoURL){
this.photoUrls=photoUrls;
}
}

@Pradeep如果能解决您的问题,请接受此答案。
public class User {
      @Id
      @GeneratedValue(strategy=GenerationType.AUTO)
      private Long id = null;
    
      @ElementCollection
      @CollectionTable(name="photoUrls")
      @Valid
      private List<String> photoUrls = new ArrayList<String>();
    
      public Long getId() {
        return id;
      }
    
      public void setId(Long id) {
        this.id = id;
      }
      public List<String> getPhotoUrls() {
        return photoUrls;
      }
    
      public void setPhotoUrls(List<String> photoUrls) {
        this.photoUrls = photoUrls;
      }
    
    }