Łą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

0

bakeraw2 dziękuję. Masz może do tego schemat bazy danych? ;)

0

Tak oczywiście:

user image

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.