Java 使用@OneToMany或@ManyToMany针对列表的未映射类<;字符串>;春季数据jpa
我正在尝试使用Crudepository实现Spring数据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&
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;
}
}