Łączenie tabel - jpa

0

Witam, mam dwie tabele w bazie danych: Produkt i Komputer i utworzyłem sobie 2 takie klasy w programie. Chciałbym teraz aby klasa Produkt zawierała atrybut klasy Komputer, czyli coś takiego:


@Entity
@Table(name="Produkt")
public class Produkt{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    int idProdukt;
    @Basic
    String a;
    @Basic
    String b;
    @Basic
    String c;
    @Basic
    String d;
    @Basic
    Komputer komputer;
}

@Table(name="Komputer")
@GeneratedValue(strategy = GenerationType.AUTO)
public class Komputer {

    @Id
    int g;
    @Basic
    String h;
    @Basic
    String i;
    @Basic
    String j;

Probowałem korzystać z adnotacji @SecondaryTable ale coś nie działa. Jak to powinno wyglądać?

0

Ale czemu nie chcesz żeby Komputer było osobną encją po prostu?

0

I encje Komputer będę dopasowywał do Encji Produkt bo idProduktu tak? O to ci chodzi? Ale przy zamówieniu np już muszę coś takiego zrobić, dlatego zadałem pytanie.

0

Ja nie bardzo rozumiem logikę tego co chcesz zrobić. Jak sie ma komputer do produktu? Komputer jest Produktem? Moja rada: w ogóle (!) nie myśl o tym że to jakos będzie w bazie składowane. Najpierw zamodeluj to obiektowo tak żeby w programie miało sens. Nie myśl o żadnych tabelach, id ani niczym takim.

0

Chciałbym się dowiedzieć jak mam się odwoływać do pól będących innymi klasami w takim przypadku np. przy zapisie do bazy.


@Entity
@Table(name="Produkt")
@SecondaryTable(name= "Klient")  // jak korzystać z więcej niż dwóch tabel?
public class Zamowienie{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    int idZamowienie;
    Klient klient;
    Adres adres;    
    Produkt produkty;
}

gdzie Klient ma pola a,b,c i Adres ma pola b,d,e itd.

Powiedzmy że mam obiekt klasy Zamówienie jak mam go zapisać do bazy korzystając z adnotacji no i wiadomo funkcji która to uczyni.

0

Szukasz problemów tam gdzie ich nie ma. Serio. Jeśli Klient, Adres i Produkt są encjami to bedą miały swoje osobne tabele w bazie i ORM sam sobie poradzi z ich zapsaniem. Ty NIC nie musisz robić. Dodajesz tylko oznaczenie krotności np. @OneToMany i informacje która strona jest właścicielem powiązania (gdzie będzie klucz obcy)

0

Ok może rzeczywiście jest jak mówisz. Nie masz może jakiejś implementacji prostej strony z logowaniem ?;) Intuicyjnie czuje że jest to bardzo prosta sprawa, wystarczy przeszukać w bazie login i hasło. Adnotacje dają wiele możliwości. Spring wiele rzeczy robi "automatycznie".

0

Mam takie coś z przypisaniem "na sztywno" loginu i hasła:


    <security:http auto-config="true">
        <security:intercept-url pattern="/add" access="ROLE_ADMIN" />

        <security:form-login login-page="/login" 
               default-target-url="/products"   
               authentication-failure-url="/loginfailed"/>
        <security:logout logout-success-url="/logout" />
    </security:http>

    <security:authentication-manager>
        <security:authentication-provider>
            <security:user-service>
                <security:user name="Admin" password="Admin123" authorities="ROLE_ADMIN" />
            </security:user-service>
        </security:authentication-provider>
    </security:authentication-manager>

login.jsp


    <c:if test="${not empty error}">
                    <div class="alert alert-danger">
                        <spring:message code="AbstractUserDetailsAuthenticationProvider.badCredentials"/><br />
                    </div>
                </c:if>
                    <form action="<c:url value="/j_spring_security_check"></c:url>" method="post">
                    <fieldset>
                        <div class="form-group">
                            <input class="form-control" placeholder="Nazwa użytkownika" name='j_username' type="text">
                        </div>
                        <div class="form-group">
                            <input class="form-control" placeholder="Hasło" name='j_password'  type="password" value="">
                        </div>
                        <input class="btn btn-lg btn-success btn-block" type="submit" value="Zaloguj się">
                    </fieldset>
                    </form>

    @RequestMapping(value="/login", method = RequestMethod.GET)
    public String login() {
        return "login";
    }

    @RequestMapping(value="/loginfailed", method = RequestMethod.GET)
    public String loginerror(Model model) {

        model.addAttribute("error", "true");
        return "login";

    }

    @RequestMapping(value="/logout", method = RequestMethod.GET)
    public String logout(Model model) {
        return "login";
    }
@Entity
@Table(name="Klient")
public class Klient {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    int idKlient;
    @Column(unique=true)
    String login;
    String haslo;

....

I jak to zmienić, żeby j_username i j_password były pobierane z bazy na podstawie j_username dla danego Klienta ? Mam z tym kłopot właśnie.

0

Podpowie mi ktoś?

1
marek527 napisał(a):

Nie masz może jakiejś implementacji prostej strony z logowaniem ?;) Intuicyjnie czuje że jest to bardzo prosta sprawa, wystarczy przeszukać w bazie login i hasło. Adnotacje dają wiele możliwości. Spring wiele rzeczy robi "automatycznie".

Tu masz przykład aplikacji korzystającej ze Spring Security:
https://github.com/DanielMichalski/spring-web-rss-channels

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0