Я использую в своем hibernate проекта Spring для сопоставления моей таблицы в классе java и используя FetchType.LAZY
Я добавил @JsonIgnore
, чтобы избежать исключения во время json-сопоставления. При такой конфигурации производительность хорошая. Это пример:Использование @JsonIgnore и FetchType.LAZY в объекте спящего режима
@Entity
@Table(name = "clientversion", catalog = "ats")
public class ClientVersion implements java.io.Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private Integer idClientVersion;
private String name;
private Date releaseDate;
private String note;
private String filePath;
@JsonIgnore
private Set<User> users = new HashSet<User>(0);
public ClientVersion() {
}
/**
* @param idClientVersion
* @param name
* @param releaseDate
* @param users
*/
public ClientVersion(Integer idClientVersion, String name, Date releaseDate, String note, String filePath, Set<User> users) {
this.idClientVersion = idClientVersion;
this.name = name;
this.note = note;
this.releaseDate = releaseDate;
this.users = users;
this.setFilePath(filePath);
}
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id_clientVersion", unique = true, nullable = false)
public Integer getIdClientVersion() {
return this.idClientVersion;
}
public void setIdClientVersion(Integer idClientVersion) {
this.idClientVersion = idClientVersion;
}
/**
* @return the name
*/
@Column(name = "name", nullable = false)
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the releaseDate
*/
@Column(name = "releaseDate", nullable = false)
public Date getReleaseDate() {
return releaseDate;
}
/**
* @param releaseDate the releaseDate to set
*/
public void setReleaseDate(Date releaseDate) {
this.releaseDate = releaseDate;
}
/**
* @return the note
*/
@Column(name = "note")
public String getNote() {
return note;
}
/**
* @param note the note to set
*/
public void setNote(String note) {
this.note = note;
}
@OneToMany(fetch = FetchType.LAZY, mappedBy = "clientVersion")
public Set<User> getUsers() {
return this.users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
/**
* @return the filePath
*/
@Column(name = "filePath")
public String getFilePath() {
return filePath;
}
/**
* @param filePath the filePath to set
*/
public void setFilePath(String filePath) {
this.filePath = filePath;
}
}
Здесь у меня нет никакой аннотации, но я не могу получить пользователь:
@Entity
@Table(name = "clientlicense", catalog = "ats")
public class ClientLicense implements java.io.Serializable{
private static final long serialVersionUID = 1L;
private Integer idClientLicense;
private Date startDate;
private Date endDate;
private int counter;
private String macAddress;
private String cpuId;
private User user;
public ClientLicense() {
}
public ClientLicense(Date startDate, Date endDate, int counter, String macAddress, String cpuId, User user) {
super();
this.startDate = startDate;
this.endDate = endDate;
this.counter = counter;
this.setMacAddress(macAddress);
this.setCpuId(cpuId);
this.user = user;
}
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id_clientLicense", unique = true, nullable = false)
public Integer getIdClientLicense() {
return this.idClientLicense;
}
public void setIdClientLicense(Integer idClientLicense) {
this.idClientLicense = idClientLicense;
}
@Column(name = "startDate", nullable = false)
@Temporal(TemporalType.DATE)//This annotation allows to use only YYYY/MM/DD
public Date getStartDate() {
return this.startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
@Column(name = "endDate", nullable = false)
@Temporal(TemporalType.DATE)
public Date getEndDate() {
return this.endDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
@Column(name = "counter", nullable = false)
public int getCounter() {
return this.counter;
}
public void setCounter(int counter) {
this.counter = counter;
}
@Column(name = "macAddress", nullable = false)
public String getMacAddress() {
return macAddress;
}
public void setMacAddress(String macAddress) {
this.macAddress = macAddress;
}
@Column(name = "cpuId", nullable = false)
public String getCpuId() {
return cpuId;
}
public void setCpuId(String cpuId) {
this.cpuId = cpuId;
}
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
@JoinColumn(name = "id_username")
public User getUser() {
return this.user;
}
public void setUser(User user) {
this.user = user;
}
}
Это возвращаемый JSON:
{"data":[{"idClientLicense":30,"startDate":"2016-02-10","endDate":"2016-02-19","counter":350,"macAddress":"1223","cpuId":"123CPU","user":null}]}
Иногда Мне нужно использовать поле user.username
в моем интерфейсе, но с этим кодом я не получаю пользователя, потому что использовал @JsonIgnore
. Чтобы устранить эту проблему, я скопировал возвращенный список с новым списком, где я установил это поле, но это плохая практика, потому что я могу скопировать много элементов. Какова наилучшая практика для решения этой проблемы?
Там нет JsonIgnore тега там, вы можете обновить фрагмент кода, чтобы включить аннотацию? –
Вы рассматривали использование DTO (объекты передачи данных)? Таким образом, вы можете контролировать то, что клиент получает в ситуациях сертен. Apache.Transformer - хороший инструмент для быстрого преобразования объекта. –
Я обновляю свой код двумя примерами. Для каждого объекта я должен создать класс DTO и в классе Service, где я вызываю jpa-запрос, мне нужно сделать сопоставление и вернуть DTO вместо объекта? – luca