JAXB рдмрдирд╛рдо org.hibernate.LazyInitializationException

рдпрд╣ рд▓реЗрдЦ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдЬреЛ рд╕реАрдЦрдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд░рдЦрддрд╛ рд╣реИ рдХрд┐ LazyInitializationException рддреНрд░реБрдЯрд┐ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП рдЬрдм JAXB рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдИ рдЧрдИ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИред
рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рдПрдХ рд▓рд┐рдВрдХ рд╣реИ рдЬреЛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ - рдХрд╕реНрдЯрдо рдПрдХреНрд╕реЗрд╕рд░реАрдлреИрдХреНрдЯреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧред

рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдХрдкреНрд░рд┐рдп рдЬреЗрдиреНрд╕рди рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ - рдЬреИрдХреНрд╕рди рдореЗрдВ рдПрдХ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

1. рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИ?
рд╣рдорд╛рд░реЗ рд╕рд╛рд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░, рдХреБрдЫ рд░рд┐рд▓реЗрд╢рдирд▓ DBMS рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ, рддреАрди рдЯреЗрдмрд▓ рдХрдВрдкрдирд┐рдпреЛрдВ, рдЙрдирдХреЗ рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛рдУрдВ рдФрд░ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ:

рдЫрд╡рд┐

рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдк рджреЛ REST рд╕реЗрд╡рд╛рдПрдБ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ: рдкрд╣рд▓рд╛ рд░рд┐рдЯрд░реНрди рдХрдВрдкрдиреА рдФрд░ рдЙрд╕рдХреЗ рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рджреВрд╕рд░рд╛ - рдХрдВрдкрдиреА рдФрд░ рдЙрд╕рдХреЗ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ:
(рдиреЛрдЯреНрд╕: рд╡рд╣ рдХрдВрдкрдиреА рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рдо рдЖрдЧреЗ рдЖрдИрдбреА = 0, рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗ: /HLS/rest/company/suppliers.xml - XML тАЛтАЛрдореЗрдВ рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
HLS - рдкрд░реАрдХреНрд╖рдг рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рд╕рдВрджрд░реНрдн рдкрде: рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдЖрд▓рд╕реА рдХреНрд░рдорд╛рдВрдХрдиред рдореИрдВ рдХреБрдЫ рднреА рд╣реЛрд╢рд┐рдпрд╛рд░ рдирд╣реАрдВ рдЖрдпрд╛ред

рдЧреНрд░рд╛рд╣рдХ XML рдФрд░ JSON рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред X, Y, Z рдХреЗ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЯреАрдо рдиреЗ рдбреЗрдЯрд╛ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Hibernate рдХреЗ рд░реВрдк рдореЗрдВ ORM рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛, JAX рдХреЛ рдЬреЗрдПрд╕рдПрди рдЬреЗрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП XML, рдЬреИрдХреНрд╕рди рдХреЛ рдЬреЗрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рдпрд╣реА рд╣реИ, рдХреЛрдбрд┐рдВрдЧ рд╢реБрд░реВ рдХрд░реЗрдВ:

package ru.habr.zrd.hls.domain; ... @Entity @Table(name = "COMPANY") @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class Company { @Id @GeneratedValue private Integer id; @Column(name = "S_NAME") private String name; @OneToMany @JoinColumn(name = "ID_COMPANY") @XmlElementWrapper //     @XmlElement(name = "supplier") private Set<Supplier> suppliers; @OneToMany @JoinColumn(name = "ID_COMPANY") @XmlElementWrapper //     @XmlElement(name = "customer") private Set<Customer> customers; // Getters/setters 

рдореИрдВ Customer.java рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛.java рдХреЗ рд▓рд┐рдП рдХреЛрдб рдирд╣реАрдВ рджреВрдВрдЧрд╛, рд╡рд╣рд╛рдВ рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рд╣реИред
рдкреИрдХреЗрдЬ-info.java рдореЗрдВ, рджреЛ рднреНрд░реВрдг рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:

 @FetchProfiles({ @FetchProfile(name = "companyWithSuppliers", fetchOverrides = { @FetchProfile.FetchOverride(entity = Company.class, association = "suppliers", mode = FetchMode.JOIN), }), @FetchProfile(name = "companyWithCustomers", fetchOverrides = { @FetchProfile.FetchOverride(entity = Company.class, association = "customers", mode = FetchMode.JOIN) }) }) package ru.habr.zrd.hls.domain; 

рдпрд╣ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ "companyWithSuppliers" рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЦреАрдВрдЪ рд▓реЗрдЧреА рдФрд░ рдЦрд░реАрджрджрд╛рд░реЛрдВ рдХреЛ рдЕрд╕рд┐рдВрдЪрд┐рдд рдЫреЛрдбрд╝ рджреЗрдЧреАред рджреВрд╕рд░рд╛ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдХрд░реЗрдЧрд╛ред
DAO рдореЗрдВ, рд╣рдо рд╡рд╛рдВрдЫрд┐рдд рднреНрд░реВрдг рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реЗрд╡рд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:

 ... public class CompanyDAO { public Company getCompany(String fetchProfile) { ... Session session = sessionFactory.getCurrentSession(); session.enableFetchProfile(fetchProfile); Company company = (Company) session.get(Company.class, 0); ... return company; } ... 

JSON рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рдХрд░рддреЗ рд╣реИрдВред CompanyDAO.getCompany () рдкрджреНрдзрддрд┐ рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдкрд╕ рдХреА рдЧрдИ рд╡рд╕реНрддреБ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдорд╛рдирдХ Objectappapper рдЬреИрдХреНрд╕рди рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛:

рдЫрд╡рд┐

рдЕрдлрд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╛рдлреА рдЙрдореНрдореАрдж рд╣реИред рд╕рддреНрд░ рдмрдВрдж рд╣реЛ рдЧрдпрд╛, рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдкреНрд░реЙрдХреНрд╕реА рдЬреЛ рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИ рд╡рд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдирд╣реАрдВ рдЦреАрдВрдЪ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЬреИрдХреНрд╕рди рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЗ рд╕реЗ рдРрд╕реЗ рдЕрд╕рд┐рдВрдЪрд┐рдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓реЗ ...

рдФрд░ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ: рдЬреИрдХреНрд╕рди-рдореЙрдбреНрдпреВрд▓-рд╣рд╛рдЗрдмрд░рдиреЗрдЯ - "рдЬреИрдХреНрд╕рди рдЬреЗрдиреНрд╕рди рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рдРрдб-рдСрди рдореЙрдбреНрдпреВрд▓ рдЬреЛ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ <...> рдбреЗрдЯрд╛рдЯрд┐рдкреНрд╕; рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрд▓рд╕реА рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рдкрд╣рд▓реВ тАЭред рдЖрдкрдХреЛ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП! рдЪрд▓рд┐рдП ObjectMapper рдХреЛ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ:

 import org.codehaus.jackson.map.ObjectMapper; import com.fasterxml.jackson.module.hibernate.HibernateModule; public class JSONHibernateObjectMapper extends ObjectMapper { public JSONHibernateObjectMapper() { registerModule(new HibernateModule()); // ,  ,     //  -  property, .    . } } 

рдФрд░ рд╣рдорд╛рд░реЗ рдирдП рдореИрдкрд░ рдХреЗ рд╕рд╛рде CompanyDAO.getCompany () рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░реЗрдВ:

рдЫрд╡рд┐

рдареАрдХ рд╣реИ, рдпрд╣ рдХрд╛рдо рдХрд┐рдпрд╛ - рдЕрдВрддрд┐рдо JSON рдореЗрдВ, рдХреЗрд╡рд▓ рдЦрд░реАрджрд╛рд░ рдФрд░ рдХреЛрдИ рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛ рдирд╣реАрдВ рд╣реИрдВ - рдПрдХрддрд░рдлрд╛ рд╕рдВрдЧреНрд░рд╣ рдХреЗрд╡рд▓ рд╢реВрдиреНрдп рд╣реИред рдХрдорд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ, рдпрд╣ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ 4 рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдХрдореА рдХреЛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдЧрд┐рдЯрд╣рдм рдкрд░ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд╡рд┐рдХрд╛рд╕ рдХреЗ рддрд╣рдд рд╣реИред рд╣рдо JAXB рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред

JAXB рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рд╕реЛрдЪрд╛ рдХрд┐ рдЙрдирдХреА рд╕рдВрддрд╛рдиреЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдХреЗ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ-рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рджреЛрд╕реНрдд рдирд╣реАрдВ рдереАрдВ, рдФрд░ рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдирд┐рдпрдорд┐рдд рд╕рд╛рдзрди рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛:



рдХреНрдпрд╛ рдХрд░реЗрдВ? рдкрд░рд┐рдпреЛрдЬрдирд╛ рд▓рдЧрднрдЧ рдЕрд╕рдлрд▓ рд╣реИред



рдФрд░ Google рдиреЗ рдХрд╣рд╛:

2. LazyInitializationException: рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ

  1. рдЖрд▓рд╕реА рд╕рдВрдЧреНрд░рд╣ рди рдмрдирд╛рдПрдВ - FetchMode.JOIN (FetchType.EAGER) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
    рдирд╣реАрдВ, рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ - рджреЛрдиреЛрдВ рд╕рдВрдЧреНрд░рд╣ (рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛рдУрдВ рдФрд░ рдЧреНрд░рд╛рд╣рдХреЛрдВ) рдХреЛ рдЖрд▓рд╕реА рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рддрдм рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рд╕ рд╕реЗрд╡рд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИ: ... / supplier.xml рдпрд╛ ... / customers.xml - рдкреНрд░рд╛рдкреНрдд XML рдореЗрдВ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛ рдФрд░ рдЧреНрд░рд╛рд╣рдХ рджреЛрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рд╣реЛрдЧрд╛ред
  2. рдЖрд▓рд╕реА рд╕рдВрдЧреНрд░рд╣реЛрдВ рдХреЗ рд╕рд╛рде рдЧрдбрд╝рдмрдбрд╝ рди рдХрд░реЗрдВ - @XmlTransient рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рдмреЗрд╢рдХ, рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдЖрдорддреМрд░ рдкрд░ рдЗрд╕ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИ)ред
    рдирд╣реАрдВ, рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ - рджреЛрдиреЛрдВ рд╕рдВрдЧреНрд░рд╣реЛрдВ (рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛рдУрдВ рдФрд░ рдЧреНрд░рд╛рд╣рдХреЛрдВ) рдХреЛ @XmlTransient рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдмрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рддрдм рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╛рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рд╕ рд╕реЗрд╡рд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИ: ... / supplier.xml рдпрд╛ ... / customers.xml - рдкреНрд░рд╛рдкреНрдд XML рдореЗрдВ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдпрд╛ рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
  3. X, Y, Z рдЯреНрд░рд┐рдХ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, HibernateInterceptor рдпрд╛ OpenSessionInViewFilter - рд╕реНрдкреНрд░рд┐рдВрдЧ рдФрд░ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ 3 рдХреЗ рд▓рд┐рдП) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рддреНрд░ рдХреЛ рдмрдВрдж рди рд╣реЛрдиреЗ рджреЗрдВред
    рдирд╣реАрдВ, рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред рдПрдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╕рддреНрд░ рд╕реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдЦреАрдВрдЪ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЕрдиреБрдЪреНрдЫреЗрдж 1 рдХреА рд╕рдорд╛рдирддрд╛ рдорд┐рд▓рддреА рд╣реИред
  4. рдбреАрдЯреАрдУ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ - рдбреАрдПрдУ рдФрд░ рдХреЗ рдмреАрдЪ рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рдкрд░рдд? (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ? - рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ), рдЖрдк рд╕реНрдерд┐рддрд┐ рдХреЛ рдХрд╣рд╛рдБ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ?
    рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдбреАрдЯреАрдУ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдбреАрдЯреАрдУ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдмреЗрд╣рддрд░ рдард╣рд░рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рддрд░рд╣ рдХрд╛ рдПрдВрдЯреАрдкреИрдЯрд░реНрди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдбреЗрдЯрд╛ рджреЛрд╣рд░рд╛рд╡ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред
  5. рдСрдмреНрдЬреЗрдХреНрдЯ рдЧреНрд░рд╛рдл "рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ" рдпрд╛ XYZ рдЯреВрд▓ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдЖрд▓рд╕реА рд╣реЗрд▓рд┐рдХреЙрдкреНрдЯрд░, рдпрджрд┐ рдЖрдк рд╕реНрдкреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрд╛рдПрдВ рдФрд░ рдбреАрдПрдУ рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЖрд▓рд╕реА рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рдирд┐рдкрдЯреЗрдВред
    рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реЛрдиреЗ рдХрд╛ рджрд╛рд╡рд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрд░рдорд╛рдВрдХрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рд╕рдорд╕реНрдпрд╛ рдмрдиреА рд╣реБрдИ рд╣реИ - рдЖрдкрдХреЛ рджреЛ рдмрд╛рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЧреНрд░рд╛рдл рд╕реЗ рдЧреБрдЬрд░рдирд╛ рд╣реЛрдЧрд╛: рдкрд╣рд▓реА рдмрд╛рд░ рдЖрд▓рд╕реА рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рджреВрд╕рд░реА рдмрд╛рд░ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдЬрдм рдпрд╣ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдХрд░рддрд╛ рд╣реИред

рд╣рдо рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдЖрддреЗ рд╣реИрдВ рдХрд┐, рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдПрдХ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдЕрдкрдиреЗ рдЖрдк рд╣реА рдЕрдиреИрддрд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдХрд╛рдЯ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ рдЬреИрдХреНрд╕рди рдХрд░рддрд╛ рд╣реИред

3. рдХрд╕реНрдЯрдо JAXB AccessorFactory
рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, Google рдиреЗ 2 рд▓рд┐рдВрдХ рдЬрд╛рд░реА рдХрд┐рдП, рдЬреЛ рдЕрдВрддрд┐рдо рдмрд╛рд░ рдЖрдП:
forum.hibernate рдФрд░ blogs.oracle ред
Ctrl + C / Ctrl + V рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╕рдорд╛рдзрд╛рди рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдФрд░ рдЗрди рд▓реЗрдЦреЛрдВ рд╕реЗ рд╕рднреА рдЕрдирд╛рд╡рд╢реНрдпрдХ рднрдп рд╕реЗ рдЕрддреНрдпрдзрд┐рдХ рдЕрдзрд┐рднрд╛рд░ред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓реЗрдЦреЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдирд╛ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдкрд░рд┐рдгрд╛рдо рдиреАрдЪреЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
  1. AccessorFactory рдХреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦреЗрдВ (рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рд╡рд░реНрдЧ JAXB рджреНрд╡рд╛рд░рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдлрд╝реАрд▓реНрдб / рдЧреБрдгреЛрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдорд╛рд░реНрд╢рд▓рд┐рдВрдЧ / рдЕрдирдорд░рд╢реЙрд▓рд┐рдВрдЧ)
  2. JAXB рдХреЛ рдмрддрд╛рдПрдВ рдХрд┐ рдЙрд╕реЗ AccessorFactory рдХреЗ рдХрд╕реНрдЯрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
  3. JAXB рдХреЛ рдмрддрд╛рдПрдВ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╣рд╛рдВ рд╕реНрдерд┐рдд рд╣реИред

рдЪрд▓реЛ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ:

 ... import com.sun.xml.bind.AccessorFactory; import com.sun.xml.bind.AccessorFactoryImpl; import com.sun.xml.bind.api.AccessorException; import com.sun.xml.bind.v2.runtime.reflect.Accessor; public class JAXBHibernateAccessorFactory implements AccessorFactory { //  AccessorFactory   - AccessorFactoryImpl.    public // ,      ,     //   wrapper. private final AccessorFactory accessorFactory = AccessorFactoryImpl.getInstance(); //     Accessor.      ,  //    private inner class,     . private static class JAXBHibernateAccessor<B, V> extends Accessor<B, V> { private final Accessor<B, V> accessor; public JAXBHibernateAccessor(Accessor<B, V> accessor) { super(accessor.getValueType()); this.accessor = accessor; } @Override public V get(B bean) throws AccessorException { V value = accessor.get(bean); //  !    -.  -   //   ,     ,  // .  Hibernate.isInitialized() c   //    Hibernate3,  Hibernate4. return Hibernate.isInitialized(value) ? value : null; } @Override public void set(B bean, V value) throws AccessorException { accessor.set(bean, value); } } //   ,    inner Accessor. @SuppressWarnings({"unchecked", "rawtypes"}) @Override public Accessor createFieldAccessor(Class bean, Field field, boolean readOnly) throws JAXBException { return new JAXBHibernateAccessor(accessorFactory.createFieldAccessor(bean, field, readOnly)); } @SuppressWarnings({"rawtypes", "unchecked"}) @Override public Accessor createPropertyAccessor(Class bean, Method getter, Method setter) throws JAXBException { return new JAXBHibernateAccessor(accessorFactory.createPropertyAccessor(bean, getter, setter)); } } 

JAXB рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, JAXBContext рдХреЛ рд╡рд┐рд╢реЗрд╖ рдЧреБрдг "com.sun.xml.bind.XmlAccessorFactory" = true рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред (рдЙрд░реНрдлрд╝ JAXBRIContext.XMLACCESSORFACTORY_SUPPORT), рдЬрд┐рд╕рдореЗрдВ @XmlAccessorFactory рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╢рд╛рдорд┐рд▓ рд╣реИред рд╡рд╕рдВрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╕реАрдзреЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм "jaxbContexProperties" рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рд╕реЗрдо "org.springframework.oxm.jaxb.Jaxb2Marshaller" рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдо рдкреИрдХреЗрдЬ-рд╕реНрддрд░реАрдп рдПрдиреЛрдЯреЗрд╢рди @XmlAccessorFactory рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╡рд░реНрдЧ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

 ... @XmlAccessorFactory(JAXBHibernateAccessorFactory.class) package ru.habr.zrd.hls.domain; import com.sun.xml.bind.XmlAccessorFactory; ... 

рдЗрди рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдХрдВрдкрдиреА рдФрд░ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд╕реЗрд╡рд╛ рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВ:



рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ - рдХреЗрд╡рд▓ рдЦрд░реАрджрд╛рд░ рдФрд░ рдХреЛрдИ рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛ рдирд╣реАрдВред рдкреНрд░рджрд╛рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдард┐рдд рд╕рдВрдЧреНрд░рд╣ рд╣рдорд╛рд░реЗ AccessorFactory рджреНрд╡рд╛рд░рд╛ рдЕрд╢рдХреНрдд рд╣реИ, рдЗрд╕рд▓рд┐рдП JAXB рдЗрд╕реЗ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ LazyInitializationException рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдлрд┐рд░ рдЖрдк рд╕реМрдВрджрд░реНрдп рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ - рдЬрд╛рд░реА рдХрд░рдиреЗ рд╕реЗ рд╕рд░реЛрдЧреЗрдЯ рдХреБрдВрдЬреА рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрджрд┐ред рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдФрд░ рд▓реЗрдЦ рд╣реИред

рдЕрдВрдд рдореЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдЦ рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рдПрдХ рдХрд╛рд░реНрдпрдХрд╛рд░реА рдЙрджрд╛рд╣рд░рдг (рд╕реНрдкреНрд░рд┐рдВрдЧ рд╡реЗрдм рдПрдорд╡реАрд╕реА рдкрд░) рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рд▓рд┐рдВрдХред рдпрд╣ рдПрдореНрдмреЗрдбреЗрдб H2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рдЦреБрдж рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рдЕрд▓рдЧ DBMS рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЬреЛ рд▓реЛрдЧ рдЧреНрд░рд╣рдг + рдПрд╕рдЯреАрдПрд╕ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдЬрд┐рд╕реЗ рдЧреНрд░рд╣рдг рдФрд░ рдПрд╕рдЯреАрдПрд╕ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдпрд╣ рд╕рдм, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

Source: https://habr.com/ru/post/In143171/


All Articles