#java #hibernate #orm #mapping
#java #гибернация #orm #сопоставление
Вопрос:
Я пытаюсь заполнить данные в этом классе из базы данных, используя аннотации сохранения Hibernate и javax. Вот соответствующие структуры базы данных.
table Poss_resp
ID qst_id resp_text
int int text
table Responses
ID qst_id usr_id resp_id
int int int int
Я пытаюсь заполнить класс Response, показанный ниже, ответами.ИДЕНТИФИКАТОР и Poss_resp.resp_text. Poss_resp содержит возможные ответы на вопрос. Ответы содержат фактические ответы. resp_id — это внешний ключ для Poss_resp. Однако я просто хочу, чтобы строка resp_text была сохранена, мне не нужен совершенно новый объект. Есть ли какой-то способ добиться этого? Я не могу понять, как сообщить Hibernate, как использовать что-то другое, кроме первичного ключа ответа, и я не определил правильный синтаксис соединения.
Мой класс ответа:
@Entity
@Table(name="responses")
public class Response {
private long id;
private long qst_id;
private long resp_id;
private String resp_text;
/**
*
*/
public Response() {
// TODO Auto-generated constructor stub
}
/**
* @return the id
*/
@Id
@Generated(value="assigned")
@Column(name="ID")
public long getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(long id) {
this.id = id;
}
/**
* @return the qst_id
*/
@Column(name="qst_id")
public long getQst_id() {
return qst_id;
}
/**
* @param qst_id the qst_id to set
*/
public void setQst_id(long qst_id) {
this.qst_id = qst_id;
}
/**
* @return the resp_id
*/
@Column(name="resp_id")
public long getResp_id() {
return resp_id;
}
/**
* @param resp_id the resp_id to set
*/
public void setResp_id(long resp_id) {
this.resp_id = resp_id;
}
/**
* @return the resp_text
*/
public String getResp_text() {
return resp_text;
}
/**
* @param resp_text the resp_text to set
*/
public void setResp_text(String resp_text) {
this.resp_text = resp_text;
}
Если это вообще возможно, я бы предпочел аннотации.
Комментарии:
1. Эти комментарии JavaDoc кажутся, как вы говорите, менее полезными.
Ответ №1:
Связь Responses
Poss_resp
между таблицей и является много-к-одному, вы должны сопоставить эту связь в Response
классе . В противном случае у hibernate недостаточно знаний Poss_resp.resp_text
, чтобы получить Responses.resp_id
Ваша Poss_resp
таблица должна быть сопоставлена с классом сущности (скажем, Class PossResp
)
Затем вы можете объявить связь «многие к одному», используя @ManyToOne
и @JoinColumn
, например:
@Entity
@Table(name="responses")
public class Response {
..................
private PossResp possResp;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "resp_id")
public PossResp getPossResp() {
return possResp;
}
................
}
Чтобы получить resp_text
данный Response
объект, вызовите
response.getPossResp().getRespText();
Мне не нужен совершенно новый объект. Есть ли какой-то способ добиться этого?
Если вы только сопоставляете объект long resp_id
вместо PossResp
объекта в PossResp
entity , я боюсь, что вам придется вручную написать HQL / SQL /Criteria, чтобы получить с resp_text
помощью long resp_id
, а затем установить его обратно Response
через setResp_text()
установщик. Но таким образом вы определенно не сможете воспользоваться преимуществами, предоставляемыми hibernate IMO.
Комментарии:
1. Узнали, что это правда. Промежуточные объекты действительно требуются. Лично я чувствую, что это тратит впустую дизайн таблицы, но я всегда могу скрыть это за другим слоем.