Avatar billede krukken Mester
11. november 2005 - 22:18 Der er 6 kommentarer og
1 løsning

Opret forbindelse mellem to tabeller i Hibernate.

Hej,

Jeg har sidder og arbejdet med hibernate, og forsøger at lave en helt simpel forbindels mellem to tabeller. Problemet er at jeg ikke rigtig kan få det til at fungere.

De to tabller jeg ønsker at lave en forbindelse imellem ser således ud:

CREATE TABLE `patient` (
  `PATIENTID` bigint(20) NOT NULL auto_increment,
  `NAME` varchar(255) default NULL,
  `ADDRESSID` bigint(20) NOT NULL default '0',
  PRIMARY KEY  (`PATIENTID`),
  KEY `RefADDRESS4` (`ADDRESSID`),
  CONSTRAINT `RefADDRESS4` FOREIGN KEY (`ADDRESSID`) REFERENCES `address` (`ADDRESSID`)
) ENGINE=InnoDB

CREATE TABLE `address` (
  `ADDRESSID` bigint(20) NOT NULL auto_increment,
  `STREET` varchar(255) NOT NULL default '',
  `ZIPCODE` int(11) NOT NULL default '0',
  `CITY` varchar(10) NOT NULL default '',
  `COUNTRY` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`ADDRESSID`)
) ENGINE=InnoDB

Jeg ønsker nu at få lavet denne forbindelse i følgende xml-fil:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="oomi.mappers">
<class name="Patient" table="PATIENT">
<id name="patientID" column="PATIENTID" type="java.lang.Integer">
<generator class="native"/>
</id>
<property name="name" column="NAME" not-null="true" type="java.lang.String" />
<property name="addressID" column="ADDRESSID" not-null="true"  />
</class>

<class name="Address">
<id name="addressID" column="ADDRESSID" >
    <generator class="native"/>
</id>
<property name="street" column="STREET" not-null="true" type="java.lang.String" />
<property name="zipcode" column="ZIPCODE" not-null="true" type="java.lang.Integer" />
<property name="city" column="CITY" not-null="true" type="java.lang.String" />
<property name="country" column="COUNTRY" not-null="true" type="java.lang.String" />
</class>
</hibernate-mapping>

Også kunne jeg rigtig godt tænke mig at få at vide hvordan man indsætter rækker til sidste.
Avatar billede arne_v Ekspert
11. november 2005 - 22:46 #1
INSERT laver du med:

ses.save(o);

Jeg er aldrig kommet så langt som til relationer - jeg ved at Hibernate har
glimrende support for det (inkl. lazy loading)
Avatar billede simonvalter Praktikant
12. november 2005 - 03:14 #2
jeg kan anbefale dig at hibernate in action som er den bedste bog skrevet om hibernate.
her er 3 forskellige måder du kan gøre det på:

component - som du vil bruge hvis du vil mappe address til samme table som user.

many-to-one som giver dig en del muligheder og som nok er det nemmeste.

one-to-one som nok vil være det første valg men ikke nødvendigvis det bedste.


Du må selv ændre så det passer dine behov:

/* forign key association */


<many-to-one name="billingAddress"
class="Address"
column="BILLING_ADDRESS_ID"
cascade="save-update" unique="true"/>


unique="true" // kun 1 user kan have den samme address, uden kan flere have samme addresse
cascade="save-update" // persister address når den får en association til en user, address har sin egen lifecycle.
cascase="all" // slet adresse når bruger slettes.


<many-to-one name="billingAddress"
class="Address"
column="BILLING_ADDRESS_ID"
cascade="all" unique="true"/> // nu er det egentligt en one-to-one

Vil du kunne navigere fra Address til User

Tilføj en property user til Address, og tilføj dette til Address mapping

<one-to-one name="user"
class="User"
property-ref="billingAddress"/>



Address address = new Address();
address.setStreet("646 Toorak Rd");
address.setCity("Toorak");
address.setZipcode("3000");

Transaction tx = session.beginTransaction();
User user = (User) session.get(User.class, userId);
address.setUser(user);
user.setBillingAddress(address);
tx.commit();


/* primary key association */


// mappes til User
<one-to-one name="address"
class="Address"
cascade="save-update"/>



<class name="Address" table="ADDRESS">
<id name="id" column="ADDRESS_ID">
<generator class="foreign"> // her tager foreign key generatoren primary key fra user og bruger den som key til address
<param name="property">user</param>
</generator>
</id>
<one-to-one name="user"
class="User"
constrained="true"/> // der er en foreigh key constraint på primary key af address der mapper til primary key af user
</class>



/* use component */


<class name="User" table="USER">
<id name="id" column="USER_ID" type="long">
<generator class="native"/>
</id>
<property name="loginName" column="LOGIN" type="string"/>
<component name="homeAddress" class="Address">
<property name="street" type="string" column="HOME_STREET" notnull="true"/>
<property name="city" type="string" column="HOME_CITY" not-null="true"/>
<property name="zipcode" type="short" column="HOME_ZIPCODE" not-null="true"/>
</component>
</class>
Avatar billede simonvalter Praktikant
12. november 2005 - 03:20 #3
her er et par sample chapters:

http://spectral.mscs.mu.edu/tools/hibernate/
tag og læs chapter 6 det fortæller om det.
Avatar billede krukken Mester
29. november 2005 - 12:22 #4
Ikke noget svar jeg kunne bruge til noget. Jeg læste manualen igennem, og fandt svaret
Avatar billede simonvalter Praktikant
29. november 2005 - 18:14 #5
krukken og hvad var svaret så?
Avatar billede krukken Mester
29. november 2005 - 22:04 #6
Jamen der er flere måder at gøre det på, men det er mere indviklet end jeg lige regnede med.
Avatar billede simonvalter Praktikant
29. november 2005 - 22:14 #7
Ja der er flere måder, jeg har nævnt de 3 jeg ved der er.. så jeg ville være meget interesseret hvis du kender flere. Om ikke andet så er det god skik at fortælle hvad man har gjort hvis man selv løser problemet og ikke har kunnet bruge de svar man har fået.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester