Dobry wieczór wszystkim,
kontynuuję nauką JDBC i doszedłem do momentu gdzie mam następującą sytuacje.
Mam dwie tabele adres i autor. Tabela autor jest połączona z tabelą adres za pomocą klucza obcego adres_id w tabeli autor. Chcę wykonać INSERT do tabeli autor za pomocą metody jak poniżej:
Metoda utworz
public Autor utworz(Autor autor) {
try {
Connection polaczenie = PolaczenieDoBazyDanych.utworzPolaczenie();
try {
PreparedStatement utworzRekord = polaczenie.prepareStatement(
"INSERT INTO autor(imie, nazwisko, data_urodzenia, adres_id ) VALUES(?,?,?,?)",
PreparedStatement.RETURN_GENERATED_KEYS);
utworzRekord.setString(1, autor.getImie());
utworzRekord.setString(2, autor.getNazwisko());
utworzRekord.setDate(3, (java.sql.Date) autor.getDataUrodzenia());// nie rozumiem dlaczego musiałem zrobić to rzutowanie?
utworzRekord.setInt(4, autor.getAdresId());// błąd The method setInt(int, int) in the type PreparedStatement is not applicable for the arguments (int, Adres)
int zmienWiersz = utworzRekord.executeUpdate();
ResultSet resultSet = utworzRekord.getGeneratedKeys();
while (resultSet.next()) {
Integer adresId = resultSet.getInt(1);
autor.setAutorId(adresId);
}
return autor;
} finally {
polaczenie.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;
i pojawia się problem. Chcę w poleceniu INSERT podać adres_id krotki z tabeli adres który będzie odpowiadał odpowiedniemu autorowi z tabeli autor. W klasie Autor zastosowałem asocjację jednokierunkową z klasą Adres za pomocą "private Adres adresId;".
Klasa Autor
package com.jdbctest.domeny;
import java.util.Date;
public class Autor {
private Integer autorId;
private String imie;
private String nazwisko;
private Date dataUrodzenia;
private Adres adresId;
public Integer getAutorId() {
return autorId;
}
public void setAutorId(Integer autorId) {
this.autorId = autorId;
}
public String getImie() {
return imie;
}
public void setImie(String imie) {
this.imie = imie;
}
public String getNazwisko() {
return nazwisko;
}
public void setNazwisko(String nazwisko) {
this.nazwisko = nazwisko;
}
public Date getDataUrodzenia() {
return dataUrodzenia;
}
public void setDataUrodzenia(Date dataUrodzenia) {
this.dataUrodzenia = dataUrodzenia;
}
public Adres getAdresId() {
return adresId;
}
public void setAdresId(Adres adresId) {
this.adresId = adresId;
}
}
Pole adresId w klasie Adres jest typu Integer "private Integer adresId;"
Klasa Adres
package com.jdbctest.domeny;
public class Adres {
private Integer adresId;
private String ulica;
private String miejscowosc;
private String kodPocztowy;
public Adres() {
}
public Adres(String ulica, String miejscowosc, String kodPocztowy) {
this.ulica = ulica;
this.miejscowosc = miejscowosc;
this.kodPocztowy = kodPocztowy;
}
@Override
public String toString() {
return "Adres [adresId=" + adresId + ", ulica=" + ulica + ", miejscowosc=" + miejscowosc + ", kodPocztowy="
+ kodPocztowy + "]";
}
public Integer getAdresId() {
return adresId;
}
public void setAdresId(Integer adresId) {
this.adresId = adresId;
}
public String getUlica() {
return ulica;
}
public void setUlica(String ulica) {
this.ulica = ulica;
}
public String getMiejscowosc() {
return miejscowosc;
}
public void setMiejscowosc(String miejscowosc) {
this.miejscowosc = miejscowosc;
}
public String getKodPocztowy() {
return kodPocztowy;
}
public void setKodPocztowy(String kodPocztowy) {
this.kodPocztowy = kodPocztowy;
}
}
Mimo to podczas pisania metody utworz pojawia mi się błąd w miejscu "utworzRekord.setInt(4,autor.getAdresId());", w którym chcę uzupełnić odpowiednią wartość w poleceniu INSERT dla adresId. Błąd o treści "The method setInt(int, int) in the type PreparedStatement is not applicable for the arguments (int, Adres)" jest jasny rozumiem że nie mogę w setInt podać indexu wartości w poleceniu INSERT i wartości adresId typu Autor, ale nie wiem jak w takim razie mam podać wartość adresId do polecenia INSERT?
Z góry dziękuję wszystkim za udzieloną pomoc i krytykę.