java - 多对多关系的空连接表

标签 java hibernate jpa

之前已经回答过不同问题的类似问题。我有一个使用 Hibernate 的双向 @ManyToMany 关系。数据保留到单独的实体表,但映射到实体表的 id 列为空。我已经尝试了 Empty Join Table resulting from JPA ManyToMany 中的建议, ManyToMany relationship, deleting records from relationship tableHibernate Many-to-many association: left hand side collection contains elements, but right hand side collection is empty , 但到目前为止还没有成功。下面是我的完整代码(我还在学习java和spring框架,菜鸟犯错提前致歉):

案例研究类

 @Entity
public class CaseStudy {

    @Id
    @GeneratedValue (strategy = GenerationType.AUTO)
    private Long caseStudyId;
    private String location;
    private String equipment;
    private String issue;
    private String solution;
    private String benefit;
    private float upper_dissolved_Oxygen;
    private float lower_dissolved_Oxygen;
    private float upper_pH;
    private float lower_pH;
    private float upper_temp;
    private float lower_temp;
    private float upper_conductivity;
    private float lower_conductivity;

    @CreationTimestamp
    private Date created;

    @ManyToOne
    @JsonBackReference
    private User user;

    private int likes;

    @ManyToMany(mappedBy="casestudyList", fetch = FetchType.EAGER)
    private List<WaterQuality> waterQualityList  = new List<WaterQuality>();

    @OneToMany(mappedBy = "casestudy", fetch = FetchType.EAGER)
    private List<Comment> commentList;

    public Long getCaseStudyId() {
        return caseStudyId;
    }


    public void setCaseStudyId(Long caseStudyId) {
        this.caseStudyId = caseStudyId;
    }


    public String getLocation() {
        return location;
    }


    public void setLocation(String location) {
        this.location = location;
    }


    public String getIssue() {
        return issue;
    }


    public void setIssue(String issue) {
        this.issue = issue;
    }


    public String getSolution() {
        return solution;
    }


    public void setSolution(String solution) {
        this.solution = solution;
    }


    public String getBenefit() {
        return benefit;
    }


    public void setBenefit(String benefit) {
        this.benefit = benefit;
    }


    public Date getCreated() {
        return created;
    }


    public void setCreated(Date created) {
        this.created = created;
    }


    public User getUser() {
        return user;
    }


    public void setUser(User user) {
        this.user = user;
    }


    public int getLikes() {
        return likes;
    }


    public void setLikes(int likes) {
        this.likes = likes;
    }


    public List<Comment> getCommentList() {
        return commentList;
    }


    public void setCommentList(List<Comment> commentList) {
        this.commentList = commentList;
    }


    public String getEquipment() {
        return equipment;
    }


    public void setEquipment(String equipment) {
        this.equipment = equipment;
    }


    public float getUpper_dissolved_Oxygen() {
        return upper_dissolved_Oxygen;
    }


    public void setUpper_dissolved_Oxygen(float upper_dissolved_Oxygen) {
        this.upper_dissolved_Oxygen = upper_dissolved_Oxygen;
    }


    public float getLower_dissolved_Oxygen() {
        return lower_dissolved_Oxygen;
    }


    public void setLower_dissolved_Oxygen(float lower_dissolved_Oxygen) {
        this.lower_dissolved_Oxygen = lower_dissolved_Oxygen;
    }


    public float getUpper_pH() {
        return upper_pH;
    }


    public void setUpper_pH(float upper_pH) {
        this.upper_pH = upper_pH;
    }


    public float getLower_pH() {
        return lower_pH;
    }


    public void setLower_pH(float lower_pH) {
        this.lower_pH = lower_pH;
    }


    public float getUpper_temp() {
        return upper_temp;
    }


    public void setUpper_temp(float upper_temp) {
        this.upper_temp = upper_temp;
    }


    public float getLower_temp() {
        return lower_temp;
    }


    public void setLower_temp(float lower_temp) {
        this.lower_temp = lower_temp;
    }


    public float getUpper_conductivity() {
        return upper_conductivity;
    }


    public void setUpper_conductivity(float upper_conductivity) {
        this.upper_conductivity = upper_conductivity;
    }


    public float getLower_conductivity() {
        return lower_conductivity;
    }


    public void setLower_conductivity(float lower_conductivity) {
        this.lower_conductivity = lower_conductivity;
    }

    public List<WaterQuality> getWaterQualityList() {
        return waterQualityList;
    }


    public void setWaterQualityList(List<WaterQuality> waterQualityList) {
        this.waterQualityList = waterQualityList;
    }


}

水质等级

    @Entity
public class WaterQuality {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long waterQualityId;
    private String description;
    private String status;
    private float dissolved_Oxygen;
    private float pH;
    private float temp;
    private float conductivity;

    @CreationTimestamp
    private Date publishDate;

    @ManyToOne
    @JsonBackReference
    private User user;

    @ManyToMany(targetEntity = CaseStudy.class, cascade = {CascadeType.ALL})
    @JoinTable(
               joinColumns = {@JoinColumn(name="water_quality_id")},
               inverseJoinColumns = {@JoinColumn(name="case_study_id")})
    private Set<CaseStudy> casestudyList = new HashSet<CaseStudy>();

    public Long getWaterQualityId() {
        return waterQualityId;
    }

    public void setWaterQualityId(Long waterQualityId) {
        this.waterQualityId = waterQualityId;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public float getDissolved_Oxygen() {
        return dissolved_Oxygen;
    }

    public void setDissolved_Oxygen(float dissolved_Oxygen) {
        this.dissolved_Oxygen = dissolved_Oxygen;
    }

    public float getpH() {
        return pH;
    }

    public void setpH(float pH) {
        this.pH = pH;
    }

    public float getTemp() {
        return temp;
    }

    public void setTemp(float temp) {
        this.temp = temp;
    }

    public float getConductivity() {
        return conductivity;
    }

    public void setConductivity(float conductivity) {
        this.conductivity = conductivity;
    }

    public Date getPublishDate() {
        return publishDate;
    }

    public void setPublishDate(Date publishDate) {
        this.publishDate = publishDate;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public Set<CaseStudy> getCasestudyList() {
        return casestudyList;
    }

    public void setCasestudyList(Set<CaseStudy> casestudyList) {
        this.casestudyList = casestudyList;
    }

    public List<CaseStudy> getDissolvedOxygenalert() {
        List<CaseStudy> dissolvedOxygenalert = casestudyList.stream()           //convert list to stream
                .filter(casestudy -> casestudy.getUpper_dissolved_Oxygen() < getDissolved_Oxygen() ||  casestudy.getLower_dissolved_Oxygen() > getDissolved_Oxygen())
                .collect(Collectors.toList());          //collect the output and convert streams to a List
        System.out.print(dissolvedOxygenalert);
        return dissolvedOxygenalert;
    }


}

我试过删除数据库重新创建,但至今没有解决问题。

下面是将数据持久化到数据库的代码 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

案例研究服务实现

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.scrunch.data.dao.CaseStudyDao;
import com.scrunch.data.model.CaseStudy;
import com.scrunch.data.model.User;
import com.scrunch.data.service.CaseStudyService;

@Service
public class CaseStudyServiceImpl implements CaseStudyService{

@Autowired
private CaseStudyDao casestudyDao;

public CaseStudy save(CaseStudy casestudy) {
    return casestudyDao.save(casestudy);
}

public Set<CaseStudy> findByUser(User user) {
    return casestudyDao.findByUser(user);
}

public CaseStudy findByCaseStudyId(Long caseStudyId) {
    return casestudyDao.findByCaseStudyId(caseStudyId);
}

public Set<CaseStudy> findAll() {
    return casestudyDao.findAll();
}
}

水质服务实现

import java.util.Date;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.scrunch.data.dao.WaterQualityDao;
import com.scrunch.data.model.User;
import com.scrunch.data.model.WaterQuality;
import com.scrunch.data.service.WaterQualityService;

@Service
public class WaterQualityServiceImpl implements WaterQualityService{

//  private static final Logger LOGGER =     LoggerFactory.getLogger(WaterQualityServiceImpl.class);

@Autowired
private WaterQualityDao waterQualityDao;


@Override
public List<WaterQuality> listAllWaterQualityByUserAndDescription(
        User user, String description) {
    return waterQualityDao.findAllWaterQualityByUserAndDescriptionContaining(user, description);
}

@Override
public WaterQuality save(WaterQuality waterQuality) {
    return waterQualityDao.save(waterQuality);
}

@Override
public List<WaterQuality> findByUser(User user) {
    return waterQualityDao.findByUser(user);
}

@Override
public WaterQuality findWaterQualityById(Long waterQualityId) {
    return waterQualityDao.findByWaterQualityId(waterQualityId);
}

@Override
public List<WaterQuality> findAll() {
    return waterQualityDao.findAll();
}
}

水质 Controller

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.scrunch.data.model.CaseStudy;
import com.scrunch.data.model.User;
import com.scrunch.data.model.WaterQuality;
import com.scrunch.data.service.WaterQualityService;

@RestController
@RequestMapping("/rest")
public class WaterQualityResource {
private String location;
private String equipment;
private String issue;
private String solution;
private String benefit;
private float upper_dissolved_Oxygen;
private float lower_dissolved_Oxygen;
private int likes;



@Autowired
private WaterQualityService waterQualityService;

@RequestMapping(value="/waterquality/add", method=RequestMethod.POST)

public WaterQuality addWaterQuality(@RequestBody WaterQuality waterQuality) {

    waterQuality.setCasestudyList(new HashSet<CaseStudy>());

    CaseStudy casestudy = new CaseStudy();
    casestudy.setLocation(location);
    casestudy.setEquipment(equipment);
    casestudy.setIssue(issue);
    casestudy.setSolution(solution);
    casestudy.setBenefit(benefit);
    casestudy.setUpper_dissolved_Oxygen(upper_dissolved_Oxygen);
    casestudy.setLower_dissolved_Oxygen(lower_dissolved_Oxygen);


    waterQuality.getCasestudyList().add(casestudy);
    return waterQualityService.save(waterQuality);
}

获取所有水质响应返回和相同结果无限循环的请求。

     [{"waterQualityId":1,"description":"sdfdsf","status":"dsfdsf","dissolved_Oxygen":5.0,"pH":7.0,"temp":72.0,"conductivity":500.0,"publishDate":1472784062000,"dissolvedOxygenalert":[{"caseStudyId":2,"location":null,"equipment":null,"issue":null,"solution":null,"benefit":null,"upper_dissolved_Oxygen":0.0,"lower_dissolved_Oxygen":0.0,"upper_pH":0.0,"lower_pH":0.0,"upper_temp":0.0,"lower_temp":0.0,"upper_conductivity":0.0,"lower_conductivity":0.0,"created":1472784062000,"likes":0,"waterQualityList":[{"waterQualityId":1,"description":"sdfdsf","status":"dsfdsf","dissolved_Oxygen":5.0,"pH":7.0,"temp":72.0,"conductivity":500.0,"publishDate":1472784062000,"dissolvedOxygenalert":[{"caseStudyId":2,"location":null,"equipment":null,"issue":null,"solution":null,"benefit":null,"upper_dissolved_Oxygen":0.0,"lower_dissolved_Oxygen":0.0,"upper_pH":0.0,"lower_pH":0.0,"upper_temp":0.0,"lower_temp":0.0,"upper_conductivity":0.0,"lower_conductivity":0.0,"created":1472784062000,"likes":0,"waterQualityList":

我能够将数据填充到连接表中,但它似乎无休止地填充。添加水质数据时会发生这种情况。

最佳答案

在发布的代码中并不清楚您是如何尝试保存关联实体的。你应该这样坚持下去……

WaterQuality waterQuality = new WaterQuality();
//Set other fields too

CaseStudy caseStudy1 = new CaseStudy();
CaseStudy caseStudy2 = new CaseStudy();
CaseStudy caseStudy3 = new CaseStudy();
CaseStudy caseStudy4 = new CaseStudy();
//Set other fileds of case study too

List<CaseStudy> caseStudyList = waterQuality.getCaseStudyList();
caseStudyList.add(caseStudy1);
caseStudyList.add(caseStudy2);
caseStudyList.add(caseStudy3);
caseStudyList.add(caseStudy4);

waterQualityService.save(waterQuality);

如果您将 WaterQuality 对象分配给 CaseStudy 实体并保存 CaseStudy,则不会在 JoinTable 中填充关联。

还有一件更重要的事情,使用 Set 而不是 List 来收集。在 List 的情况下,假设,你已经有 100 个 waterQuality 案例研究,如果你想删除其中一个,那么它将首先删除整个案例研究然后再次添加所有案例研究,除了已删除的案例研究。如果您的集合不包含重复项,请使用 Set。如果您的集合也包含重复项,则使用带索引的列表。

关于java - 多对多关系的空连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39259794/

相关文章:

java - 使用哪个java集合?

java - HttpUrlConnection getResponseCode 抛出 java.net.SocketException : Unexpected end of file from server

java - 使用 GWT 2.6 将 Java 7 升级到 Java 8

java - Hibernate 集合保留对已删除实体的引用

java - Java 中 Python 的 heapq 相当于什么?

java - Hibernate Criteria Query 不适用于日期

java - JPA2.1 - 调用返回 CLOB 的存储过程

java - hibernate 还是 JPA?

java - 为什么大多数 hibernate 应用程序都使用序列来生成 id?

java - 从 Criteria 或 : Dynamic WHERE clause with dynamic columns in select 获取 WHERE 子句作为 HQL 字符串