<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>The Code-House Blog &#187; Niekategoryzowane</title>
	<atom:link href="http://blog.code-house.org/category/niekategoryzowane/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.code-house.org</link>
	<description>Blog niewielkiej firmy z branży IT.</description>
	<lastBuildDate>Fri, 11 Jun 2010 15:43:19 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>XML i Adnotacje &#8211; kod ogólnego przeznaczenia i JPA</title>
		<link>http://blog.code-house.org/2009/10/xml-i-adnotacje-kod-ogolnego-przeznaczenia-i-jpa/</link>
		<comments>http://blog.code-house.org/2009/10/xml-i-adnotacje-kod-ogolnego-przeznaczenia-i-jpa/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 18:55:31 +0000</pubDate>
		<dc:creator>Łukasz Dywicki</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Niekategoryzowane]]></category>

		<guid isPermaLink="false">http://blog.code-house.org/?p=117</guid>
		<description><![CDATA[W poprzednim wpisie  przedstawiłem sposób na redukcję kodu w encjach przy pomocy dziedziczenia i adnotacji @MappedSuperclass. Rozwiązanie to możemy również stosować aby tworzyć kod bardziej przenośny, który niewielkim kosztem można użyć w innych projektach.

Większość aplikacji webowych stosuje autoryzację opartą o role (ang. Role Based Access Control), w takich wypadkach mamy zazwyczaj encję User oraz [...]]]></description>
			<content:encoded><![CDATA[<p>W <a href="http://blog.code-house.org/2009/09/dwie-klasy-redukujace-ilosc-kodu-w-encjach-jpa/">poprzednim wpisie</a>  przedstawiłem sposób na redukcję kodu w encjach przy pomocy dziedziczenia i adnotacji @MappedSuperclass. Rozwiązanie to możemy również stosować aby tworzyć kod bardziej przenośny, który niewielkim kosztem można użyć w innych projektach.</p>
<p><!-- more --><br />
Większość aplikacji webowych stosuje autoryzację opartą o role (ang. <em>Role Based Access Control</em>), w takich wypadkach mamy zazwyczaj encję User oraz Role, pierwszą odpowiedzialną za przetrzymywanie informacji o użytkowniku a druga nazwy ról. O ile role są obszarem stałym &#8211; zawsze mają nazwę &#8211; o tyle użytkownicy często mają różne wariacje i relacje. Ot choćby powiązanie konta użytkownika z firmą.</p>
<pre class="brush: java;">
// Copyright (C) 2009 Code-House
// All rights reserved
package org.code_house.security.domain;

import java.util.Calendar;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.ManyToMany;
import javax.persistence.MappedSuperclass;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.code_house.domain.BaseEntity;

/**
 * Klasa reprezentująca użytkownika. Powinna ona zostać nadpisana w docelowym
 * systemie poprzez plik orm.xml.
 *
 * @author Łukasz Dywicki.
 */
@MappedSuperclass
public class SecurityUser extends BaseEntity {

    /**
     * Hasło użytkownika.
     */
    @Column
    private String password;

    /**
     * Login użytkownika.
     */
    @Column
    private String username;

    /**
     * Konto wygasło.
     */
    @Column
    @Temporal(TemporalType.TIMESTAMP)
    private Calendar expire;

    /**
     * Grupy do których przynależy użytkownik.
     */
    @ManyToMany(mappedBy = &quot;users&quot;)
    private Set&lt;Role&gt; roles;

    /**
     * Konto zablokowane np. po 3 nieudanych próbach logowania.
     */
    @Column
    private boolean locked;

    /**
     * Konto wyłączone np. przez administratora.
     */
    @Column
    private boolean enabled;

   // Dalej gettery i settery
}
</pre>
<p>Rola ma niekompletną definicję relacji do klasy SecurityUser, którą należy uzupełnić o informacje na temat encji docelowej i definicji tabeli pośredniczącej.</p>
<pre class="brush: java;">
// Copyright (C) 2009 Code-House
// All rights reserved
package org.code_house.security.domain;

import javax.persistence.Entity;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

import org.code_house.domain.NamedEntity;

/**
 * Klasa reprezentująca rolę. Może to być np ADMIN, USER bądź cokolwiek innego.
 *
 * @author Łukasz Dywicki luke@code-house.org
 */
@Entity
@Table(name = &quot;roles&quot;)
public class Role extends NamedEntity {

    @ManyToMany
    @JoinTable(name = &quot;users_roles&quot;,
        joinColumns = @JoinColumn(name = &quot;role_id&quot;, referencedColumnName = &quot;id&quot;)
    )
    private Set&lt;SecurityUser&gt; users;

    // gettery i settery
}
</pre>
<p>Oto kawałek konfiguracji XML, która uzupełni metadane i pozwoli na uruchomienie kodu. Atrybut <strong>target-entity</strong> pozwala na określenie tabeli docelowej relacji podczas gdy element <strong>inverse-join-column</strong> uzupełnia definicję tabeli pośredniczącej.</p>
<pre class="brush: xml; class-name: xml;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;entity-mappings version=&quot;1.0&quot;
        xmlns=&quot;http://java.sun.com/xml/ns/persistence/orm&quot;
        xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
        xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd&quot;&gt;

    &lt;package&gt;org.code_house.security.domain&lt;/package&gt;

    &lt;entity class=&quot;Role&quot;&gt;
        &lt;attributes&gt;
            &lt;many-to-many name=&quot;users&quot; target-entity=&quot;org.code_house.management.domain.User&quot;&gt;
                &lt;join-table&gt;
                    &lt;inverse-join-column name=&quot;user_id&quot; referenced-column-name=&quot;id&quot; /&gt;
                &lt;/join-table&gt;
            &lt;/many-to-many&gt;
        &lt;/attributes&gt;
    &lt;/entity&gt;
    &lt;entity class=&quot;Memento&quot;&gt;
        &lt;attributes&gt;
            &lt;one-to-one name=&quot;user&quot; target-entity=&quot;org.code_house.management.domain.User&quot;&gt;
                &lt;join-column name=&quot;user_id&quot; /&gt;
            &lt;/one-to-one&gt;
        &lt;/attributes&gt;
    &lt;/entity&gt;
&lt;/entity-mappings&gt;
</pre>
<p>Przykład ten można wykorzystać by uzupełniać relacje, których nie sposób odzwierciedlić w kodzie.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.code-house.org/2009/10/xml-i-adnotacje-kod-ogolnego-przeznaczenia-i-jpa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
