如何不使用ManyToOne关系从MySQL数据库获取数据的主键实体

时间:2019-06-20 14:15:38

标签: hibernate spring-boot jpa spring-data-jpa

我在从不包含任何主键(弱实体)的表中获取数据时遇到问题。我有两个表-DataPrescription。在Prescription中有一个主键-token_id,而Data包含多于1行,其中包含有关单个token_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

}

Prescription.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;
    }
}

PrescriptionDao.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;


     }

}

我实际上将整个程序从从两个表中简单地获取数据转换为这个程序,因此可能会有多个错误。我是这个概念的新手,但是我必须在提交项目时这样做。 如果结果在“数据列表”中,那就好了。

谢谢。

1 个答案:

答案 0 :(得分:1)

没有主键就不能拥有实体:

根据规范:

  

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

}