# Hibernate Annotation @OneToOne Fremdschlüssel



## BoggyB (11. Nov 2011)

Hallo zusammen, 

Ich habe eine Tabelle "news" die folgendermaßen aufgebaut ist:

id-headline-datum

und eine Tabelle "texte":

n_id-text

n_id ist hierbei die id aus der Tabelle news.
Alle Tabellen in der DB sind MyIsam Tabellen und somit sind keine Fremdschlüssel in der Tabelle definiert (weiß nicht ob das wichtig ist). 

Ich habe versucht das ganze mit Hibernate Annotations hinzukriegen, bisher leider ohne Erfolg. 
Die news werden eingefügt, auch die m zu n Beziehungen zu anderen Tabellen funktionieren, allerdings werden die Texte nicht befüllt. 

Das habe ich bisher (abgeschrieben aus verschiedensten Forums- und Blogeinträgen)

Texte

```
package portal_nachrichten.entity;
// Generated 03.11.2011 16:07:18 by Hibernate Tools 3.2.1.GA

import javax.persistence.*;
import org.hibernate.annotations.Parameter;
/**
 * Texte generated by hbm2java
 */
@Entity
@Table(name = "texte", catalog = "portal_nachrichten_fa")
public class Texte implements java.io.Serializable
{

    private int NId;
    private String text;
    private String linked;

    public Texte()
    {
    }

    public Texte(int NId, String text, String linked)
    {
        this.NId = NId;
        this.text = text;
        this.linked = linked;
    }

    @Id
    @GeneratedValue(generator = "foreignGenerator")
    @org.hibernate.annotations.GenericGenerator(name = "foreignGenerator",
    strategy = "foreign",
    parameters =
    @Parameter(name = "property", value = "news"))
    @Column(name = "n_id", unique = true, nullable = false)
    public int getNId()
    {
        return this.NId;
    }

    public void setNId(int NId)
    {
        this.NId = NId;
    }

    @Column(name = "text", nullable = false, length = 65535)
    public String getText()
    {
        return this.text;
    }

    public void setText(String text)
    {
        this.text = text;
    }

     public void setLinked(String linked)
    {
        this.linked = linked;
    }
}
```

News:

```
package portal_nachrichten.entity;
// Generated 07.11.2011 14:02:06 by Hibernate Tools 3.2.1.GA

import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.*;


/**
 * News generated by hbm2java
 */
@Entity
@Table(name = "news", catalog = "portal_nachrichten_fa", uniqueConstraints =
@UniqueConstraint(columnNames =
{
    "headline", "date"
}))
public class News implements java.io.Serializable
{

    private Integer id;
    private String headline;
    private Date date;
    private Set<Anbieter> anbieter = new HashSet<Anbieter>();
    private Set<Isin> isin = new HashSet<Isin>();
    private Set<Kategorie> kategorie = new HashSet<Kategorie>();
    private Set<Branche> branche = new HashSet<Branche>();
    private Texte texte;
    private int arivaID;

    public News()
    {
    }

    public News(String headline)
    {
        this.headline = headline;
    }

    public News(String headline, Date date)
    {
        this.headline = headline;
        this.date = date;
    }

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "id", unique = true, nullable = false)
    public Integer getId()
    {
        return this.id;
    }

    public void setId(Integer id)
    {
        this.id = id;
    }

    @OneToOne(cascade = CascadeType.MERGE)
    @PrimaryKeyJoinColumn
    public Texte getTexte()
    {
        return texte;
    }

    public void setTexte(Texte texte)
    {
        this.texte = texte;
    }

    @Column(name = "headline", nullable = false, length = 200)
    public String getHeadline()
    {
        return this.headline;
    }

    public void setHeadline(String headline)
    {
        this.headline = headline;
    }

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "date", length = 19)
    public Date getDate()
    {
        return this.date;
    }

    public void setDate(Date date)
    {
        this.date = date;
    }
}
```

Ich hoffe ihr könnt mir weiterhelfen

Danke


----------



## JimPanse (11. Nov 2011)

Wenn ich es richtig  verstehe soll 'Text' als Primarey key den Primarey key von 'News' beinhalten, dann ist die Modellierung falsch rum:


```
@Entity
public class Text implements Serializable{

@Id
@GeneratedValue(generator = "foreignGenerator")
@org.hibernate.annotations.GenericGenerator(name = "foreignGenerator", strategy = "foreign",
parameters = @Parameter(name = "property", value = "news"))
private int id;

@OneToOne
@PrimaryKeyJoinColumn
private News news;
}
```

um es Bi-Direktional zu haben:


```
@Entity
public class News implements Serializable{

@OneToOne(mappedBy="news")
private Text text;

}
```

Greetz


PS:


```
@Column(unique = true, nullable = false)
```
Ist an einer Identifikator unnötig -> DB - Id's (sollten) immer unique und nicht null sein ;-)


----------



## BoggyB (12. Nov 2011)

Vielen Dank, es funktioniert jetzt. 



JimPanse hat gesagt.:


> ```
> @Column(unique = true, nullable = false)
> ```
> Ist an einer Identifikator unnötig -> DB - Id's (sollten) immer unique und nicht null sein ;-)



Die Klassen hab ich mir aus der Datenbank generieren lassen, macht das performance mäßig was aus oder kann ich das so lassen, schadet ja eigentlich nicht ^^.


----------



## JimPanse (15. Nov 2011)

BoggyB hat gesagt.:


> Vielen Dank, es funktioniert jetzt.
> 
> 
> 
> Die Klassen hab ich mir aus der Datenbank generieren lassen, macht das performance mäßig was aus oder kann ich das so lassen, schadet ja eigentlich nicht ^^.



Wie gesagt primary key's sollten in jedem RDBMS nicht null und Eineindeutig sein ob dein Zusatz irgendwelche Auswirkungen hat denke ich nicht.


----------

