2016-04-25 11 views
1

Ich bin relativ neu zu JPA und Hibernate und versuche zu sehen, wie die @ OneTo One Annotation funktioniert, sagen wir, ich habe eine Entität "Task" mit der folgende Beziehung:Hibernate: @ OneToOne keine "eins zu eins" Beziehung in der Datenbank

@OneToOne 
    @JoinColumn(name = "manager_id") 
    private Manager manager; 

Und es gibt das Unternehmen „Manager“:

@Entity 
@Table(name = "manager") 
public class Manager { 

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
private Long id; 
private String name; 

public Manager() { 
} 

Wenn ich die Testdatei zusammen mit dem „hibernate.hbm2ddl.auto“ auf „Update“ laufen bekomme ich einen Viele zu One-Beziehung in der Datenbank (wie Sie sehen können, gibt es keine eindeutige Einschränkung irgendeiner Art, die es zu einer Eins machen würde Eins-Beziehung):

CREATE TABLE IF NOT EXISTS `timesheet`.`task` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT, 
    `completed` BIT(1) NOT NULL, 
    `description` VARCHAR(255) NULL DEFAULT NULL, 
    `manager_id` BIGINT(20) NULL DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    INDEX `FK3635851B178516` (`manager_id` ASC), 
    CONSTRAINT `FK3635851B178516` 
    FOREIGN KEY (`manager_id`) 
    REFERENCES `timesheet`.`manager` (`id`)) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8; 

davon zu sein, dass ich zwei Datensätze mit demselben Manager-ID versucht, das Hinzufügen und wurde in der Tat zugegeben, ich habe auch versucht, wie „@Table(name = "Task",uniqueConstraints = @UniqueConstraint(columnNames =...“ die eindeutige Einschränkung Einstellung aber kein Glück. Also warum passiert das und was ist das Beste an der Verwendung von @OneToOne annotaion, wenn keine Anwendungslogik angewendet wird, um dies zu überprüfen?

Auch Gibt es eine Chance, dass Hibernate nicht in der Lage ist, richtig die DDL Generation zu tun? (Ich weiß, dass die Generierung von Schemas durch den Ruhezustand nur zum Testen gedacht ist)

+1

Geben Sie Ihre zweite Entitätsklasse – mariusz2108

+0

welche Einheit Sie? Sowohl Aufgabe als auch Manager sind dort –

+0

Ich erwarte auch eine einzigartige Beschränkung, die durch eine @ OneToOne Beziehung erzeugt wird. Ich sehe nicht, wie die angenommene Antwort ... beantwortet dies! – xtian

Antwort

3

In einer unidirektionalen Beziehung erhalten Sie die erwartete eindeutige Integritätsbedingung, wenn Sie sie als "optional = false" markieren. Sie erhalten es auch, wenn Sie die Join-Spalte explizit als eindeutig definieren.

Also entweder

@OneToOne(optional=false) 
    @JoinColumn(name = "manager_id") 
    private Manager manager; 

oder

@OneToOne 
    @JoinColumn(name = "manager_id", unique=true) 
    private Manager manager; 

Warum brauchen Sie es nicht optional markieren? Meine Schätzung ist, dass die Spalte, wenn ein Wert optional ist, viele Nullwerte enthalten kann, aber in vielen Datenbanken kann dies nicht durchgeführt werden, wenn eine eindeutige Einschränkung vorhanden ist. Sie können es jedoch in MySQL tun, also berücksichtigt der Hibernate-Generator in diesem Fall möglicherweise nicht die Datenbank (ein Fehler?). Siehe eine Diskussion über MySQL Umgang mit Nullen here.

Verwandte Themen