首页 > 解决方案 > 如何使用多对一关系从 mysql 数据库中获取没有主键实体

问题描述

我在从不包含任何主键(弱实体)的表中获取数据时遇到问题。我有两张桌子 -DataPrescription. Prescription里面有一个主键 -并且包含多于 1 行,其中包含有关token_id单个. 我怎么能这样做?我无法向表中添加任何主键。该表已提供给我,因此我无法更改。Datatoken_id

我尝试并遵循了 YouTube 中的一些教程,但没有奏效。我还在stackoverflow中检查了一些答案,但这似乎与我的api结构不符。我完全被困住了。我尝试@MantToOne按照教程中所示使用,然后将存储库用于函数,但这似乎不起作用。

我有两个模型类 - Data.java

@Repository
@Entity
@Table(name="data")

public class Data {


    @Column(name="ticket_no")
    private String ticket_no;

    @Column(name="type")    
    String type;    

    @Column(name="unit")
    private String unit;

    @Column(name="value")
    private float value;

    @ManyToOne
    private Prescription pres;
    //getters and setters

}

处方.java



@Entity
@Table(name="prescriptions")
public class Prescription {

    @Id
    @Column(name="ticket_no")
    private String ticket_no;

    @Column(name="description")    
    String description; 

    @Column(name="download_link")
    private String download_link;

    //getters and setters

两个存储库:DataRepository.java

public interface DataRepository extends JpaRepository<Data, String> {

 public List<Data> findByPrescriptionTicket_no(String token);

}

PrescriptionRepository.java

public interface PrescriptionRepository extends JpaRepository<Prescription, String> {   
}

两个 Dao 类:DataDao.java

@Service
public class DataDao {


    @Autowired
    DataRepository datarepo;

    public List<Data> findOne(String token) {
        List<Data> meddat=new ArrayList<>();
        datarepo.findByPrescriptionTicket_no(token).forEach(meddat::add);
        return meddat;
    }
}

处方道.java

@Service
public class PrescriptionDao {


    @Autowired
    PrescriptionRepository presrepo;

    public Prescription findOne(String token) {
        return presrepo.findOne(token);
    }
}

控制器类

@RestController
@RequestMapping(value = "/rest/users")
public class MainController {


    @Autowired
    DataDao datadao;

    @Autowired
    PrescriptionDao presdao;

    @Autowired
    ProcessData pd;

     @GetMapping("/persons")
     public String loadPersons(@RequestParam("access_token") String access_token) throws  ParseException{
        String decode_token = pd.testDecodeJWT(access_token);
        String token = pd.jsondata(decode_token);
        String pres=presdao.findOne(token).toString();
        List<Data> med= datadao.findOne(token);
        String tot_data= "{"+"\"medical_data\":"+med+","+"\"hb_prescription\":"+pres+"}";
        return tot_data;


     }

}

实际上,我将整个程序从简单地从两个表中获取数据转换为这个程序,因此可能会出现多个错误。我对这个概念很陌生,但我必须为项目提交这样做。如果结果在数据列表中,那就太好了。

提前致谢。

标签: hibernatespring-bootjpaspring-data-jpa

解决方案


您不能拥有没有主键的实体:

从规范:

2.4 主键和实体身份

每个实体都必须有一个主键。

必须在作为实体层次结构根的实体类或映射超类上定义主键,该映射超类是实体层次结构中所有实体类的(直接或间接)超类。主键必须在实体层次结构中只定义一次。

来源:https ://download.oracle.com/otn-pub/jcp/persistence-2_1-fr-eval-spec/JavaPersistence.pdf?AuthParam=1561040540_b447233fdfd994fdb2338dd9407c4977

因此,您必须创建数据字段的主键。

如果它们组合起来是唯一的,您可以创建一个像这样的复合键:

public class DataKey implements Serializable  {

    @Id
    private String ticket_no;

    @Id
    String type;    

    @Id
    private String unit;

    @Id
    private float value;

    // getters, setters, equals and hashCode implementations
}

@Entity
@Table(name="data")
@IdClass(DataKey.class)
public class Data {

    @Id
    @Column(name="ticket_no")
    private String ticket_no;

    @Id
    @Column(name="type")    
    String type;    

    @Id
    @Column(name="unit")
    private String unit;

    @Id
    @Column(name="value")
    private float value;

    @ManyToOne
    private Prescription pres;

    //getters and setters

}

推荐阅读