Hibernate 5 和 JPA:select table 没有他的 children 但在保存时保持持久性
Hibernate 5 and JPA: select table without his children but maintain persistence on save
我有两个模型:Ordine 和 DettaglioOrdine。
我希望这样,当我保存类型为“Ordine”的 object 时,hibernate 也会保存他的 child“DettaglioOrdine”(这有效)。
但是,如果我执行 select 查询,查询会非常非常慢,因为 hibernate 还会检索 DettaglioOrdine。所以,我想要没有“DettaglioOrdine”的“Ordine”object object。
“普通”型号:
@Entity
@Table(name="ordini")
@NamedQuery(name="Ordine.findAll", query="SELECT o FROM Ordine o")
public class Ordine extends DataObject<Integer> {
private static final long serialVersionUID = 1L;
private Integer id;
[...]
private List<Dettagliordine> dettagliordine;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(unique=true, nullable=false)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
//bi-directional many-to-one association to Dettagliordine
@Column(insertable = true, updatable = true)
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="ordine")
public List<Dettagliordine> getDettagliordine() {
return this.dettagliordine;
}
public void setDettagliordine(List<Dettagliordine> dettagliordine) {
this.dettagliordine = dettagliordine;
}
public Dettagliordine addDettagliordine(Dettagliordine dettaglioordine) {
dettaglioordine.setOrdine(this);
this.dettagliordine.add(dettaglioordine);
return dettaglioordine;
}
public Dettagliordine removeDettagliordine(Dettagliordine dettagliordine) {
dettagliordine.setOrdine(null);
this.dettagliordine.remove(dettagliordine);
return dettagliordine;
}
}
DettaglioOrdine 型号:
@Entity
@Table(name="dettagliordine")
@NamedQuery(name="Dettagliordine.findAll", query="SELECT d FROM Dettagliordine d")
public class Dettagliordine extends DataObject<Integer> {
private static final long serialVersionUID = 1L;
private Integer id;
[...]
public Dettagliordine() {
}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(unique=true, nullable=false)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
[...]
//bi-directional many-to-one association to Ordini
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="idOrdine", nullable=false)
public Ordine getOrdine() {
return this.ordine;
}
public void setOrdine(Ordine ordine) {
this.ordine = ordine;
}
}
这是我的查询:
SessionFactory sessionFactory = getSessionFactory();
Session session = sessionFactory.getCurrentSession();
List<OrdineDTO> result = null;
try{
String hql = "select d.ordine from Dettagliordine d "
+ "group by d.ordine.id";
Query<Ordine> query = session.createQuery(hql,Ordine.class);
List<Ordine> res = query.getResultList();
result = new OrdineDMO().unmarshall(res);
}catch (DMOException e) {
e.printStackTrace();
}
它不是休眠。 dettagliordine
你有 fetch=FetchType.LAZY
。 Hibernate 不必获取与父项的惰性关联。
问题可能出在这里
result = new OrdineDMO().unmarshall(res);
如果 unmarshall()
方法中的代码触及 dettagliordine
或调用不同于 get、set 方法(如 toString()
方法)的方法,Hibernate 将获取 dettagliordine
协会。
您可以启用 Hibernate 日志记录并调试代码。您将看到何时实际进行提取。另请记住,如果您调试持久性 类,调试器可能会导致调用 toString()
方法,并且也会获取关联。
最好将此行移到 session/@Transactional 代码块之外。
result = new OrdineDMO().unmarshall(res);
您将有 LazyInitializationExcepton
,对惰性关联有任何不需要的访问权限。
我有两个模型:Ordine 和 DettaglioOrdine。 我希望这样,当我保存类型为“Ordine”的 object 时,hibernate 也会保存他的 child“DettaglioOrdine”(这有效)。 但是,如果我执行 select 查询,查询会非常非常慢,因为 hibernate 还会检索 DettaglioOrdine。所以,我想要没有“DettaglioOrdine”的“Ordine”object object。
“普通”型号:
@Entity
@Table(name="ordini")
@NamedQuery(name="Ordine.findAll", query="SELECT o FROM Ordine o")
public class Ordine extends DataObject<Integer> {
private static final long serialVersionUID = 1L;
private Integer id;
[...]
private List<Dettagliordine> dettagliordine;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(unique=true, nullable=false)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
//bi-directional many-to-one association to Dettagliordine
@Column(insertable = true, updatable = true)
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="ordine")
public List<Dettagliordine> getDettagliordine() {
return this.dettagliordine;
}
public void setDettagliordine(List<Dettagliordine> dettagliordine) {
this.dettagliordine = dettagliordine;
}
public Dettagliordine addDettagliordine(Dettagliordine dettaglioordine) {
dettaglioordine.setOrdine(this);
this.dettagliordine.add(dettaglioordine);
return dettaglioordine;
}
public Dettagliordine removeDettagliordine(Dettagliordine dettagliordine) {
dettagliordine.setOrdine(null);
this.dettagliordine.remove(dettagliordine);
return dettagliordine;
}
}
DettaglioOrdine 型号:
@Entity
@Table(name="dettagliordine")
@NamedQuery(name="Dettagliordine.findAll", query="SELECT d FROM Dettagliordine d")
public class Dettagliordine extends DataObject<Integer> {
private static final long serialVersionUID = 1L;
private Integer id;
[...]
public Dettagliordine() {
}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(unique=true, nullable=false)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
[...]
//bi-directional many-to-one association to Ordini
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="idOrdine", nullable=false)
public Ordine getOrdine() {
return this.ordine;
}
public void setOrdine(Ordine ordine) {
this.ordine = ordine;
}
}
这是我的查询:
SessionFactory sessionFactory = getSessionFactory();
Session session = sessionFactory.getCurrentSession();
List<OrdineDTO> result = null;
try{
String hql = "select d.ordine from Dettagliordine d "
+ "group by d.ordine.id";
Query<Ordine> query = session.createQuery(hql,Ordine.class);
List<Ordine> res = query.getResultList();
result = new OrdineDMO().unmarshall(res);
}catch (DMOException e) {
e.printStackTrace();
}
它不是休眠。 dettagliordine
你有 fetch=FetchType.LAZY
。 Hibernate 不必获取与父项的惰性关联。
问题可能出在这里
result = new OrdineDMO().unmarshall(res);
如果 unmarshall()
方法中的代码触及 dettagliordine
或调用不同于 get、set 方法(如 toString()
方法)的方法,Hibernate 将获取 dettagliordine
协会。
您可以启用 Hibernate 日志记录并调试代码。您将看到何时实际进行提取。另请记住,如果您调试持久性 类,调试器可能会导致调用 toString()
方法,并且也会获取关联。
最好将此行移到 session/@Transactional 代码块之外。
result = new OrdineDMO().unmarshall(res);
您将有 LazyInitializationExcepton
,对惰性关联有任何不需要的访问权限。