java - Hibernate OneToMany SELECT 在实体映射中给出重复列

标签 java hibernate hql one-to-many hibernate-onetomany

我需要在 Society 和 BlockFloors Table 之间建立一对多关系。错误: 调用init方法失败;嵌套异常是 org.hibernate.MappingException:实体映射中的重复列:com.example.domain.SocietyBlockFloor 列:society_id(应使用 insert="false"update="false"进行映射)

SocietyDetails.java

package com.example.domain;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity
@Table(name="society_details")
public class SocietyDetails {
    public static final long serialVersionUID = 1L;

    @Id
    @Column(name = "society_id")
    private String societyId;

    @Column(name = "society_name")
    private String societyName;

    @Column (name = "society_address")
    private String societyAddress;

    @Column (name = "society_country_details_code")
    private String societyCountryDetailsCode;

    @OneToMany(mappedBy = "societyDetails", cascade = CascadeType.ALL)
    private List<SocietyBlockFloor> societyBlockFloor = new ArrayList<SocietyBlockFloor>();

    @Override
    public String toString() {
        return "Society{" +
                "societyId='" + societyId + '\'' +
                ", societyName='" + societyName + '\'' +
                ", societyAddress='" + societyAddress + '\'' +
                ", societyCountryDetailsCode='" + societyCountryDetailsCode + '\'' +
                ", societyBlockFloor='" + societyBlockFloor + '\'' +
                '}';
    }

    public static long getSerialVersionUID() {
        return serialVersionUID;
    }

    public String getSocietyId() {
        return societyId;
    }

    public void setSocietyId(String societyId) {
        this.societyId = societyId;
    }

    public String getSocietyName() {
        return societyName;
    }

    public void setSocietyName(String societyName) {
        this.societyName = societyName;
    }

    public String getSocietyAddress() {
        return societyAddress;
    }

    public void setSocietyAddress(String societyAddress) {
        this.societyAddress = societyAddress;
    }

    public String getSocietyCountryDetailsCode() {
        return societyCountryDetailsCode;
    }

    public void setSocietyCountryDetailsCode(String societyCountryDetailsCode) {
        this.societyCountryDetailsCode = societyCountryDetailsCode;
    }

    public List<SocietyBlockFloor> getSocietyBlockFloor() {
        return societyBlockFloor;
    }

    public void setSocietyBlockFloor(List<SocietyBlockFloor> societyBlockFloor) {
        this.societyBlockFloor = societyBlockFloor;
    }
}

SocietyBlockFloor.java

package com.example.domain;

import javax.persistence.*;
import java.io.Serializable;

@Entity
@Table(name="society_block_floor")
public class SocietyBlockFloor implements Serializable {
    public static final long serialVersionUID = 1L;

    @Id
    @Column(name="society_id")
    private String societyBlockFloorId;

    @Column(name="society_block")
    private String societyBlock;

    @Column(name="society_floor")
    private String societyFloor;

    @ManyToOne
    @JoinColumn(name = "society_id", nullable = false)
    private SocietyDetails societyDetails;

    @Override
    public String toString() {
        return "HASocietyBlockFloor{" +
                "societyBlockFloorId='" + societyBlockFloorId + '\'' +
                ", societyBlock='" + societyBlock + '\'' +
                ", societyFloor='" + societyFloor + '\'' +
                ", societyDetails='" + societyDetails + '\'' +
                '}';
    }

    public String getSocietyBlockFloorId() {
        return societyBlockFloorId;
    }

    public String getSocietyBlock() {
        return societyBlock;
    }

    public void setSocietyBlock(String societyBlock) {
        this.societyBlock = societyBlock;
    }

    public String getSocietyFloor() {
        return societyFloor;
    }

    public void setSocietyFloor(String societyFloor) {
        this.societyFloor = societyFloor;
    }

    public SocietyDetails getSocietyDetails() {
        return societyDetails;
    }

    public void setSocietyDetails(SocietyDetails societyDetails) {
        this.societyDetails = societyDetails;
    }
}

DAO 类

package com.example.dao.impl;

@Repository
public class SocietyDetailsDAOImpl extends BaseDAOImpl implements SocietyDetailsDAO {
    @Override
    public List<SocietyDetails> getSocietyDetailsByName(String societyName) throws Exception {
        try {
            String queryString = "from SocietyDetails society JOIN society.societyBlockFloor where society.societyName=:societyName";
            Query query = getSessionFactory().getCurrentSession().createQuery(queryString);
            query.setParameter("societyName", societyName);
            List<SocietyDetails> societyDetails = query.list();
            return societyDetails;
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
    }
}

我已经尝试更改 SocietyBlockFloor.societyBlockFloorId 的名称,但在 ON 子句中它仍然使用 (society.societyId = SocietyBlockFloor.societyId),其中 SocietyBlockFloor.societyId 不存在。

最佳答案

映射中有重复的列。您映射同一数据库列两次。你有:

@Id
@Column(name="society_id")
private String societyBlockFloorId;

@ManyToOne
@JoinColumn(name = "society_id", nullable = false)
private SocietyDetails societyDetails;

这似乎没什么用

@Id
@Column(name="society_id")
private String societyBlockFloorId;

如果您想要 SocietyID,只需询问 societyDetails.getId();

这在多对一方面 referencedColumnName = "society_id"

关于java - Hibernate OneToMany SELECT 在实体映射中给出重复列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61302000/

相关文章:

java - where子句中的hql问题

SQL:表到键值表

java - HQL 按日期查询(Java+NetBeans)

java - Eclipse Virgo 中的 OSGI 服务绑定(bind)器

java - 正则表达式 : Insert space in the string after a matched pattern

java - Java 中的PreparedStatement,带有数据库和列名变量

sql - 如何查看hive变量的值?

在 Spring Integration 中模拟 MessageHandler 时出现 java.lang.NoSuchMethodError

java - hibernate 和 spring 持久性问题。可能的身份值(value)没有增加?

java - 使用函数输入 Hibernate 参数