Προς το περιεχόμενο

Hibernate insert with foreign key


Προτεινόμενες αναρτήσεις

Δημοσ.

Καλημέρα.

 

Έχω αυτήν εδώ την βάση


SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

CREATE TABLE IF NOT EXISTS `Authors` (
  `AutID` int(11) NOT NULL,
  `Name` varchar(50) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;


INSERT INTO `Authors` (`AutID`, `Name`) VALUES
(1, 'Tolkien');

CREATE TABLE IF NOT EXISTS `Books` (
  `BookID` int(11) NOT NULL,
  `AutID` int(11) NOT NULL,
  `Name` varchar(50) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;


INSERT INTO `Books` (`BookID`, `AutID`, `Name`) VALUES
(1, 1, 'LOTR');

ALTER TABLE `Authors`
  ADD PRIMARY KEY (`AutID`);

ALTER TABLE `Books`
  ADD PRIMARY KEY (`BookID`), ADD KEY `AutID` (`AutID`);

ALTER TABLE `Authors`
  MODIFY `AutID` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=2;
  
ALTER TABLE `Books`
  MODIFY `BookID` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=2;
  
ALTER TABLE `Books`
ADD CONSTRAINT `fkautid` FOREIGN KEY (`AutID`) REFERENCES `Authors` (`AutID`) ON DELETE NO ACTION ON UPDATE NO ACTION;

Έστω ότι θέλω να βάλω στην  βάση ένα άλλο βιβλίο από τον Tolkien.

Το κάνω με τον παρακάτω κώδικα

 public static void main(String[] args) {
              
        try {
            
            BufferedReader br=new BufferedReader(new InputStreamReader (System.in));
            
            System.out.println("Book Name");
            String NamensBook=br.readLine();            
            
            HibernateUtil myHiber=new HibernateUtil();
            
            SessionFactory sessFabrika=myHiber.getSessionFactory();
       
            Session s = sessFabrika.openSession();
            s.beginTransaction();      
           
            //get author
            Query q=s.createQuery("FROM Authors Where Name=:n");
            q.setParameter("n", "Tolkien");
            Authors Auth=(Authors) q.list().get(0);
            
            Books b=new Books();
            b.setAuthors(Auth);
            b.setName(NamensBook);            
           
            s.save(;
            s.getTransaction().commit();
            s.close();
            
            System.out.println("ΟΚ");
            
        }
        
        catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    

Είναι όμως αυτός ο ενδεδειγμένος τρόπος ; Θέλω να πώ εαν είχα κι άλλα foreign keys στον πίνακα Books θα πρέπει να κάνω query  την βάση για να παίρνω τα αντίστοιχα objects ;

 

 

Δημοσ.
Είναι όμως αυτός ο ενδεδειγμένος τρόπος ; Θέλω να πώ εαν είχα κι άλλα foreign keys στον πίνακα Books θα πρέπει να κάνω query  την βάση για να παίρνω τα αντίστοιχα objects ;

 

Ναι αυτός είναι ο ενδεδειγμένος τρόπος. Μάλιστα αν είχες Bi-directional relation - δηλαδή αν ο Author είχε List<Book>, θα έπρεπε να προσθέσεις και το Book στη λιστα του author για να έχεις consistent objects.

Εξαίρεση: αν ήξερες το Primary Key του author θα μπορούσες να κάνεις new Author() και set to primary key και θα έβρισκε ποιός είναι.

Τέλος διάβασε 2 πράγματα για τα Java naming conventions, ποτέ τα variables με κεφαλαίο.

  • Like 1

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...