Java 许多关系中的JPA不兼容映射。基数与其反向指针的基数不一致

Java 许多关系中的JPA不兼容映射。基数与其反向指针的基数不一致,java,jpa,many-to-many,eclipselink,Java,Jpa,Many To Many,Eclipselink,eclipse链接在应用程序初始化期间引发以下错误 我找不到原因,尽管在这里进行了彻底的搜索 这就是错误: Caused by: Exception [EclipseLink-7244] (Eclipse Persistence Services - 2.6.1.qualifier): org.eclipse.persistence.exceptions.ValidationException Exception Description: An incompatible mapping h

eclipse链接在应用程序初始化期间引发以下错误 我找不到原因,尽管在这里进行了彻底的搜索

这就是错误:

Caused by: Exception [EclipseLink-7244] 
(Eclipse Persistence Services - 2.6.1.qualifier): org.eclipse.persistence.exceptions.ValidationException

Exception Description: 
An incompatible mapping has been encountered between [class User] and [class UserAuthProvider]. This usually occurs when the cardinality of a mapping does not correspond with the cardinality of its backpointer.

at org.eclipse.persistence.exceptions.ValidationException.invalidMapping(ValidationException.java:1296)
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.ManyToManyAccessor.process(ManyToManyAccessor.java:158)
at org.eclipse.persistence.internal.jpa.metadata.MetadataProject.processNonOwningRelationshipAccessors(MetadataProject.java:1628)
at org.eclipse.persistence.internal.jpa.metadata.MetadataProject.processStage3(MetadataProject.java:1917)
at org.eclipse.persistence.internal.jpa.metadata.MetadataProcessor.processORMMetadata(MetadataProcessor.java:577)
at org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processORMetadata(PersistenceUnitProcessor.java:604)
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:1943)
... 48 more
我的课

使用者

@实体
@表(name=“users”)
@XmlRootElement
公共类用户实现可序列化{
私有静态最终长serialVersionUID=1L;
@基本(可选=假)
@NotNull
@尺寸(最小值=1,最大值=255)
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“id”)
私人长id;
@身份证
@基本(可选=假)
@NotNull
@尺寸(最小值=1,最大值=255)
@列(name=“username”)
私有字符串用户名;
@大小(最大值=512)
@列(name=“password”)
私有字符[]密码;
@列(name=“enabled”)
启用私有布尔值;
@许多酮
@JoinColumn(name=“用户角色”)
私人角色;
@多人(mappedBy=“用户”)
私人收藏提供者;
@OneTONE(mappedBy=“user”,cascade=CascadeType.PERSIST)
@NotNull
私有用户信息用户信息;
@列(name=“firstname”)
私有字符串名;
@列(name=“lastname”)
私有字符串lastName;
@列(name=“displayname”)
私有字符串显示名;
@列(name=“gender”)
私人性别;
@列(name=“address”,长度=512)
私有字符串地址;
@列(name=“address\u geo”,长度=512)
私有字符串地址;
@时态(javax.persistence.TemporalType.DATE)
@列(name=“生日”)
私人生日;
@时态(javax.persistence.TemporalType.DATE)
@列(name=“创建日期”)
创建私人日期;
@时态(javax.persistence.TemporalType.DATE)
@列(name=“date\u modified”)
修改私人日期;
公共枚举性别{
男,女,不详
}
公共用户(){
性别=性别。未知;
语言环境greekLocale=新语言环境(“el”);
dateCreated=Calendar.getInstance(greekLocale.getTime();
启用=真;
authProviders=newhashset();
userInfo=新的userInfo(此);
}
公共用户(字符串用户名){
这个();
this.username=用户名;
}
公共用户(字符串用户名,字符[]密码){
这个();
this.username=用户名;
this.password=密码;
}
//接球手和接球手
@凌驾
公共int hashCode(){
int hash=0;
hash+=(username!=null?username.hashCode():0);
返回散列;
}
@凌驾
公共布尔等于(对象){
//TODO:警告-如果未设置id字段,此方法将不起作用
if(!(用户的对象实例)){
返回false;
}
用户其他=(用户)对象;
如果((this.username!=null&&other.username!=null)&&(this.username.equals(other.username))){
返回true;
}
返回true;
}
}
UserAuthProvider

@Entity
@Table(name = "user_auth_provider")
@XmlRootElement

public class UserAuthProvider implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Long id;

@Basic(optional = false)
@Column(name = "providername")
private String providerName;

@Basic(optional = true)
@ManyToMany
@JoinTable(
        name = "auth_providers_per_user",
        joinColumns = {
            @JoinColumn(name = "auth_provider_id", referencedColumnName = "id")},
        inverseJoinColumns = {
            @JoinColumn(name = "username", referencedColumnName = "username")})
private Collection<User> users;

@Temporal(javax.persistence.TemporalType.DATE)
@Column(name = "date_created")
private Date dateCreated;

@Temporal(javax.persistence.TemporalType.DATE)
@Column(name = "date_modified")
private Date dateModified;

@Column(name = "enabled")
private Boolean enabled;

public UserAuthProvider() {
    Locale greekLocale = new Locale("el");
    dateCreated = Calendar.getInstance(greekLocale).getTime();
    users = new HashSet<>();
    enabled = true;
}

@Override
public int hashCode() {
    int hash = 5;
    hash = 11 * hash + Objects.hashCode(this.id);
    return hash;
}

@Override
public boolean equals(Object obj) {
    if (obj == null) {
        return false;
    }
    if (getClass() != obj.getClass()) {
        return false;
    }
    final UserAuthProvider other = (UserAuthProvider) obj;
    if (!Objects.equals(this.id, other.id)) {
        return false;
    }
    return true;
}

}
@实体
@表(name=“user\u auth\u provider”)
@XmlRootElement
公共类UserAuthProvider实现可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@基本(可选=假)
@列(name=“id”)
私人长id;
@基本(可选=假)
@列(name=“providername”)
私有字符串提供者名称;
@基本(可选=真)
@许多
@可接合(
name=“每个用户的认证提供商”,
joinColumns={
@JoinColumn(name=“auth\u provider\u id”,referencedColumnName=“id”)},
反向连接列={
@JoinColumn(name=“username”,referencedColumnName=“username”)}
私人收藏用户;
@时态(javax.persistence.TemporalType.DATE)
@列(name=“创建日期”)
创建私人日期;
@时态(javax.persistence.TemporalType.DATE)
@列(name=“date\u modified”)
修改私人日期;
@列(name=“enabled”)
启用私有布尔值;
公共UserAuthProvider(){
语言环境greekLocale=新语言环境(“el”);
dateCreated=Calendar.getInstance(greekLocale.getTime();
users=newhashset();
启用=真;
}
@凌驾
公共int hashCode(){
int hash=5;
hash=11*hash+Objects.hashCode(this.id);
返回散列;
}
@凌驾
公共布尔等于(对象obj){
if(obj==null){
返回false;
}
如果(getClass()!=obj.getClass()){
返回false;
}
最终UserAuthProvider other=(UserAuthProvider)obj;
如果(!Objects.equals(this.id,other.id)){
返回false;
}
返回true;
}
}

任何帮助都是有价值的,谢谢您从所有关联映射中删除
@Basic
@Basic
用于基本字段。从

一个基本属性是w
@Entity
@Table(name = "user_auth_provider")
@XmlRootElement

public class UserAuthProvider implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Long id;

@Basic(optional = false)
@Column(name = "providername")
private String providerName;

@Basic(optional = true)
@ManyToMany
@JoinTable(
        name = "auth_providers_per_user",
        joinColumns = {
            @JoinColumn(name = "auth_provider_id", referencedColumnName = "id")},
        inverseJoinColumns = {
            @JoinColumn(name = "username", referencedColumnName = "username")})
private Collection<User> users;

@Temporal(javax.persistence.TemporalType.DATE)
@Column(name = "date_created")
private Date dateCreated;

@Temporal(javax.persistence.TemporalType.DATE)
@Column(name = "date_modified")
private Date dateModified;

@Column(name = "enabled")
private Boolean enabled;

public UserAuthProvider() {
    Locale greekLocale = new Locale("el");
    dateCreated = Calendar.getInstance(greekLocale).getTime();
    users = new HashSet<>();
    enabled = true;
}

@Override
public int hashCode() {
    int hash = 5;
    hash = 11 * hash + Objects.hashCode(this.id);
    return hash;
}

@Override
public boolean equals(Object obj) {
    if (obj == null) {
        return false;
    }
    if (getClass() != obj.getClass()) {
        return false;
    }
    final UserAuthProvider other = (UserAuthProvider) obj;
    if (!Objects.equals(this.id, other.id)) {
        return false;
    }
    return true;
}

}