多对多 org.hibernate.MappingException

Many to Many org.hibernate.MappingException

我知道这个问题被问过多次,但我正在失去理智,我正在尝试创建多对多关系,但出现以下异常:

    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mySqlSessionFactory' defined in class path resource [database/hibernate.xml]: Invocation of init method fai
led; nested exception is org.hibernate.MappingException: Could not determine type for: java.util.Set, at table: manager_ova, for columns: [org.hibernate.mapping.Column(availSenss)]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1794)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516)
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean[=11=](AbstractBeanFactory.java:324)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:330)
        ... 108 more
Caused by: org.hibernate.MappingException: Could not determine type for: java.util.Set, at table: manager_ova, for columns: [org.hibernate.mapping.Column(availSenss)]
        at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:499)
        at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:466)
        at org.hibernate.mapping.Property.isValid(Property.java:227)
        at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:624)
        at org.hibernate.mapping.RootClass.validate(RootClass.java:267)
        at org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:354)
        at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:465)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:708)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:724)
        at org.springframework.orm.hibernate5.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:616)
        at org.springframework.orm.hibernate5.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:600)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1853)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1790)
        ... 115 more

实体:

@Entity
@Table(name = "sens")
@Getter
@Setter
@Recoverable(backupOption = BackupOption.BASIC, fileDependecies = {})
public class Sens implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 5622870770478762574L;

    @Id
    @Column(unique = true, nullable = false)
    private Long id;
    
    @Column(unique = false, nullable = false)
    private String name;
    
    @ManyToMany(mappedBy = "availSenss")
    private Set<ManagerOva> ovas;
    
    public Sens() {}

    @Override
    public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((id == null) ? 0 : id.hashCode());
    result = prime * result + ((name == null) ? 0 : name.hashCode());
    result = prime * result + ((ovas == null) ? 0 : ovas.hashCode());
    return result;
    }

    @Override
    public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Sens other = (Sens) obj;
    if (id == null) {
        if (other.id != null)
        return false;
    } else if (!id.equals(other.id))
        return false;
    if (name == null) {
        if (other.name != null)
        return false;
    } else if (!name.equals(other.name))
        return false;
    if (ovas == null) {
        if (other.ovas != null)
        return false;
    } else if (!ovas.equals(other.ovas))
        return false;
    return true;
    }
    
    
}

@Entity
@Table(name = "manager_ova")
@Getter
@Setter
@Recoverable(backupOption = BackupOption.BASIC, fileDependecies = {})
public class ManagerOva implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 2994716515279921578L;

    @Id
    @Column(unique = true, nullable = false)
    private Long id;
    
    @Column(unique = false, nullable = false)
    private String name;
    
    @JoinTable(name = "manager_ova_sens", joinColumns = @JoinColumn(name = "ova_id"), inverseJoinColumns = @JoinColumn(name = "sens_id"))
    private Set<Sens> availSenss;
    
    public ManagerOva() {}

    @Override
    public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((availSenss == null) ? 0 : availSenss.hashCode());
    result = prime * result + ((id == null) ? 0 : id.hashCode());
    result = prime * result + ((name == null) ? 0 : name.hashCode());
    return result;
    }

    @Override
    public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    ManagerOva other = (ManagerOva) obj;
    if (availSenss == null) {
        if (other.availSenss != null)
        return false;
    } else if (!availSenss.equals(other.availSenss))
        return false;
    if (id == null) {
        if (other.id != null)
        return false;
    } else if (!id.equals(other.id))
        return false;
    if (name == null) {
        if (other.name != null)
        return false;
    } else if (!name.equals(other.name))
        return false;
    return true;
    }
    
    

}

我不确定我做错了什么,花了几个小时试图找出问题所在。 帮助 table 是使用 ova_id、sensor_id 手动创建的 table 中名为 vm_ova_sensors

的 PK 和 FK

谢谢

每个双向关联必须只有一个 拥有方 (子方),另一个被称为反向(或 mappedBy)方。由于@ManyToMany关联是对称的,拥有方可以是任何一方。

@JoinTable 注释应在拥有方使用。因此,您应该按以下方式更正您的映射:

@Entity
public class ManagerOVARecord extends OVARecord {

   // ...

   @ManyToMany
   @JoinTable(name = "vm_ova_sensors", 
             joinColumns = @JoinColumn(name = "ova_id"), 
             inverseJoinColumns = @JoinColumn(name = "sensor_id")
   )
   private Set<Sensor> availableOnSensors = new HashSet<>();

   // ...
}

@Entity
@Table(name = "ts_sensors")
public class Sensor implements Identifiable, Serializable {

   // ...
    
   @ManyToMany(mappedBy = "availableOnSensors")
   private Set<ManagerOVARecord> availableOvas = new HashSet<>(); 

   // ...
}

另请参阅休眠文档的 this section