рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рдкреНрд░рдерд╛рдУрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЬреЛ рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХреНрд▓рд┐рдкреНрд╕рд▓рд┐рдВрдХ ORM рдврд╛рдВрдЪреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рджреЛ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рд╕реАрдЦрд╛ред
рдпрд╣ рд▓реЗрдЦ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА JPA рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдврд╛рдВрдЪреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ, рдЪрд╛рд╣реЗ рд╡рд╣ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рд╣реЛ рдпрд╛ OpenJPAред
рдкрд░рд┐рдпреЛрдЬрдирд╛, рдЬрд┐рд╕рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореИрдВ рдЙрджреНрдзреГрдд рдХрд░реВрдВрдЧрд╛, рд╡рд╕рдВрдд рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред
рд╕рдорд╕реНрдпрд╛:
рдирд┐рдореНрди рддрд╛рд▓рд┐рдХрд╛рдПрдБ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ
ARTICLES -> Article.java ( ID int, NAME varchar ); ARTICLE_ROLES ( ARTICLE_ID int, ROLE_ID int ); ROLES -> Role.java ( ID int, NAME varchar );
рд░реЛрд▓ рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдорд╛рдирдХ рд▓реБрдХрдЕрдк рддрд╛рд▓рд┐рдХрд╛ рд╣реИред
рддрджрдиреБрд╕рд╛рд░, рдЗрдХрд╛рдИ рдЕрдиреБрдЪреНрдЫреЗрдж рдореЗрдВ, рд╣рдо JoinTable рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
@ManyToOne(optional = false, targetEntity = Role.class, fetch = FetchType.EAGER, cascade = { CascadeType.MERGE, CascadeType.REFRESH }) @JoinTable(name = "ARTICLE_ROLES", joinColumns = {@JoinColumn(name = "ARTICLE_ID", referencedColumnName="ID", nullable = false}, inverseJoinColumns = {@JoinColumn(name = "ROLE_ID", referencedColumnName = "ID", nullable = false)}) public Role getRole() { return role; }
рдЕрдм рд╣рдо рдХреНрд╡реЗрд░реА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ - getAllArticles рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИрдВ:
@NamedQuery(name = "Article. getAllArticles", query = "SELECT s FROM Article s")
рдФрд░ рдПрдХ рд╣рдлреНрддреЗ рдмрд╛рдж, рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рджрд╕ рд╣рдЬрд╛рд░ рд▓реЗрдЦ рд╣реЛрдиреЗ рд╕реЗ, рд╣рдореЗрдВ рдЦрд░рд╛рдм рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрддреЗрдВ рдорд┐рд▓рдиреА рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред рд╕рдорд╕реНрдпрд╛ред
рд╕рдорд╕реНрдпрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг:
рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдпрд╣ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП EclipseLink PerformanceMonitor рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рддрдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдкреНрд░рд╢реНрди JPA рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВред
рдЗрд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рджреГрдврд╝рддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реИред xml
<persistence> тАж <properties> тАж <property name="eclipselink.profiler" value="PerformanceMonitor"/> </properties> </persistence-unit> </persistence>
рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рд╕рд╛рде рджреГрдврд╝рддрд╛ред Xml рдкрд░реАрдХреНрд╖рдг рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╣реЛ рд╕рдХрддреА рд╣реИред
рд▓реЗрдХрд┐рди рдмреАрдиреНрд╕ред xml рд╡реЗ рдЕрд▓рдЧ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> тАж <property name="jpaPropertyMap"> <map> <entry key="eclipselink.profiler" value="PerformanceMonitor" /> </map> </property> </bean>
рдЫреЛрдЯрд╛ рдиреЛрдЯрдЗрд╕ рддрд░рд╣ @PersistenceContext рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Profiler рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рди рдХрд░реЗрдВ:
@PersistenceContext(properties={@PersistenceProperty(name="eclipselink.profiler",value="PerformanceMonitor")}) protected EntityManager em;
рдпрд╣ рддрд░реАрдХрд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдЕрдм рд╣рдо рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЕрдкрдиреЗ рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
PerformanceMonitor profiler = (PerformanceMonitor)em.unwrap(Session.class).getProfiler();
PerformanceMonitor рдореЗрдВ рдПрдХ Map рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╕рднреА рд╕реВрдЪрдирд╛рдУрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдкреНрд░рд╢реНрдиреЛрдВ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рд╕рдордп рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред
рд╣рдо рджреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ: рдХрд╛рдЙрдВрдЯрд░: ReadAllQuery рдФрд░ рдХрд╛рдЙрдВрдЯрд░: ReadObjectQueryред
рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВред
Long before = profiler.getOperationTimings.get("Counter:ReadAllQuery") + profiler.getOperationTimings.get("Counter:ReadObjectQuery "); em.createNamedQuery("Article.getAllArticles").getResultList(); Long after = profiler .getOperationTimings.get("Counter:ReadAllQuery") + profiler.getOperationTimings.get("Counter:ReadObjectQuery ");
рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЕрдВрддрд░ 1 рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди 10001ред рдЖрдЙрдЪред
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рднреНрд░реВрдг = FetchType.EAGER рдХреЗ рдмрд╛рд╡рдЬреВрдж, JoinTable рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, JPA рд╕рдВрдмрдВрдзрд┐рдд рдкрдВрдХреНрддрд┐ рд╡рд╕реНрддреБ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддрд╛ рд╣реИред
рд╕рдорд╛рдзрд╛рди, рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг:
рдПрдХ рд╕рдВрдХреЗрдд рдЬреЛрдбрд╝реЗрдВ рдЬреЛ JPA рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдХреИрд╕реЗ рд▓рд╛рдпрд╛ рдЬрд╛рдП
@NamedQuery(name = "Article. getAllArticles", query = "SELECT s FROM Article s", hints = { <b>@QueryHint(name = QueryHints. FETCH, value = "s.role")</b>)
рдЗрд╕ рд╕рдВрдХреЗрдд рдХреЗ рд╡рд╛рдХреНрдп рд╡рд┐рдиреНрдпрд╛рд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рдмреЗрдЯреА рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдкреНрд░рд╢реНрди рдХреЗ рдкрд╛рда рдореЗрдВ рд╡рд╕реНрддреБ рдХреЗ рдЙрдкрдирд╛рдо рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрджрд┐ рдЖрдк рдЧрд▓рддреА рд╕реЗ рдПрдХ рдЕрд▓рдЧ рдкрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрдХреЗрдд рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЪреБрдкрдЪрд╛рдк рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдЕрд╡рдзрд┐ рдХреЗ рдмрд╛рдж рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЕрдиреБрдЪреНрдЫреЗрдж рдХреЗ рдЕрдВрджрд░ рд╕рджрд╕реНрдп рдХреЗ рдирд╛рдо рд╕реЗ рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
public class Article { тАж Role <b>role</b>; тАж }
рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рдЕрдм рдбреЗрдЯрд╛рдмреЗрд╕ рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рдХреНрд╡реЗрд░реА рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЕрдЪрд╛рдирдХ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрд░реЛрдз рдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯреА рд╕рдВрдЦреНрдпрд╛ рдЕрдм рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рджрд╕ рд╣рдЬрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдХреЗрд╡рд▓ рдиреМ рд╣реИред рд╕рдорд╕реНрдпрд╛ред
рд╕рдорд╛рдзрд╛рди, рджреВрд╕рд░рд╛ рд╕рдВрд╕реНрдХрд░рдгред
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ QueryHints.FETCH JOIN рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ JOIN TABLE рдореЗрдВ рдХреЛрдИ рд╕рдВрдЧрдд рд▓рд╛рдЗрди рдирд╣реАрдВ рд╣реИ (рд▓реЗрдЦ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рднреВрдорд┐рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реИ), рддреЛ рдореБрдЦреНрдп рд▓рд╛рдЗрди рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрдПрдЧреАред
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП QueryHints.LEFT_FETCH рд╣реИред
рдЕрдВрддрд┐рдо рд╕рдорд╛рдзрд╛рди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
@NamedQuery(name = "Article. getAllArticles", query = "SELECT s FROM Article s", hints = { @QueryHint(name = QueryHints.LEFT_FETCH, value = "s.role"))
рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд╡реЗрд░реА, рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдЬрд┐рдирдХреЗ рдмрд┐рдирд╛ рдЖрдкрдХреЛ рдХреНрд╡реЗрд░реА рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдЗрд╕ рддрд░рд╣ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред