Hibernate One-to-One Аннотация ведет себя странно - PullRequest
0 голосов
/ 06 мая 2018

Я делаю соединение один к одному, чтобы получить результат с помощью аннотации. У меня есть два класса: первый - T_ARM_Details, а второй - ARM_Ticket_Details и T_ARM_Alert_Type. Я выполняю соединение один в один с использованием аннотации, но соединение не происходит и извлекает данные из одной таблицы

package com.cts.met.bo;

import java.io.Serializable; 
import javax.persistence.CascadeType;
import javax.persistence.Column; 
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;

@Entity
@Table(name="T_ARM_Details")

public class ARM_Ticket_Details implements Serializable {   

@Id
@Column(name="ticket_id")

  String Ticket_id;

@Column(name="arm_alert_type_id")
int arm_alert_type_id;
 /*@ManyToOne(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
 @JoinTable(name="T_arm_alert_type",joinColumns=@JoinColumn(name="arm_alert_type_id",referencedColumnName="arm_alert_type_id"),inverseJoinColumns=@JoinColumn(name= "response_status_id"))*/

 public int getArm_alert_type_id() {
return arm_alert_type_id;
  }

public void setArm_alert_type_id(int arm_alert_type_id) {
this.arm_alert_type_id = arm_alert_type_id;
}

private T_ARM_Alert_Type t_arm_alert_type;



 //private T_SLA_Status t_sla_statuse;

public String getTicket_id() {
  return Ticket_id;
 }

public void setTicket_id(String ticket_id) {
Ticket_id = ticket_id;
} 
 @OneToOne(fetch=FetchType.LAZY,mappedBy="ARM_Ticket_Details",
 cascade=CascadeType.ALL)
  @JoinTable(name="T_arm_alert_type", 
 joinColumns=@JoinColumn(name="arm_alert_type_id"))//,
 referencedColumnName="arm_alert_type_id"))
  //@JoinColumn(name="arm_alert_type_id")
 public T_ARM_Alert_Type getT_arm_alert_type() {
return t_arm_alert_type;
}

public void setT_arm_alert_type(T_ARM_Alert_Type t_arm_alert_type) {
this.t_arm_alert_type = t_arm_alert_type;
}


/*@ManyToOne(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
  @JoinTable(name="T_sla_status",
   joinColumns=@JoinColumn(name="resolution_status_id")//,
 //inverseJoinColumns=@JoinColumn(name= "response_status_id")
 )
 //@JoinColumn(name="status_id")
*/
/*public T_SLA_Status getT_sla_statuse() {
return t_sla_statuse;
  }

public void setT_sla_statuse(T_SLA_Status t_sla_statuse) {
this.t_sla_statuse = t_sla_statuse;
 }*/

}

А следующий следующий:

package com.cts.met.bo;

import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;

 @SuppressWarnings("serial")
 @Entity
  @Table(name="T_arm_alert_type")
  public class T_ARM_Alert_Type implements Serializable{
  @Id
 //@OneToOne(targetEntity=ARM_Ticket_Details.class,cascade=CascadeType.ALL)

//@JoinColumn(name="arm_alert_type_id",referencedColumnName="arm_alert_type_ 
  id")
  /*@OneToOne(fetch=FetchType.LAZY)
  @PrimaryKeyJoinColumn*/
    //@JoinColumn(name="arm_alert_type_id")
   int arm_alert_type_id;

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

@OneToOne(fetch=FetchType.LAZY)
@JoinColumn(name="ticket_id")
private ARM_Ticket_Details arm;
public ARM_Ticket_Details getArm() {
    return arm;
}
public void setArm(ARM_Ticket_Details arm) {
    this.arm = arm;
}
public int getArm_alert_type_id() {
    return arm_alert_type_id;
}
public void setArm_alert_type_id(int arm_alert_type_id) {
    this.arm_alert_type_id = arm_alert_type_id;
}
public String getArm_alert_desc() {
    return arm_alert_desc;
}
public void setArm_alert_desc(String arm_alert_desc) {
    this.arm_alert_desc = arm_alert_desc;
}

}

Мой контроллер выглядит так:

 @RequestMapping(value = "/editTicket", method = RequestMethod.GET)
public ModelAndView editTicket(HttpServletRequest request){
    String TicketId = request.getParameter("id");
    ARM_Ticket_Details ticket = pmportalService.getARMTicketById(TicketId);
    ModelAndView model = new ModelAndView("editTicket");
    model.addObject("ticket", ticket);

    return model;
}

Я ожидаю, что здесь произойдет соединение, но оно выдает следующую ошибку:

   select
    arm_ticket0_.ticket_id as ticket_i1_1_0_,
    arm_ticket0_.arm_alert_type_id as arm_aler2_1_0_,
    arm_ticket0_.t_arm_alert_type as t_arm_al3_1_0_ 
    from
    T_ARM_Details arm_ticket0_ 
    where
    arm_ticket0_.ticket_id=?

Может кто-нибудь помочь, пожалуйста? Кстати, я новичок в спящем режиме.

1 Ответ

0 голосов
/ 06 мая 2018

Я думаю, что ваша проблема в том, что вы используете Lazy FetchType, где вы должны использовать EAGER или пропустить его явное определение, так как это значение по умолчанию FetchType. Ленивая загрузка используется из соображений производительности, чаще всего, когда у вас есть отношение OneToMany и загрузка слишком большого количества объектов, если они не нужны, влияет на производительность каждой операции. Вам редко нужно использовать ленивую выборку для OneToOne отношений, потому что вы используете только один дополнительный объект, и это не повлияет на производительность вашего приложения, за исключением, может быть, особых случаев с огромными объектами. Вы можете узнать больше о различных типах выборок и их эффектах в документации .

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