Как не иметь первичного ключевого объекта, используя ManyToOne Relation для извлечения данных из базы данных MySQL - PullRequest
1 голос
/ 20 июня 2019

У меня проблема с извлечением данных из таблицы, которая не содержит первичного ключа (Слабая сущность). У меня есть две таблицы - Data и Prescription. В 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> {   
}

Два Дао Класса: 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 Ответ

1 голос
/ 20 июня 2019

У вас не может быть сущностей без первичного ключа:

Из спецификации:

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...