2014-12-29 2 views
-1

Я абсолютно новый в развитии Hibernate, и у меня есть следующая проблема.Почему в этом отображении Hibernate используется @ManyToOne вместо @OneToOne?

У меня есть 2 классов сущностей, которая отображает 2 таблицы БД:

1) Первый класс сущностей (главная) называется KM_ProjectInfo и отображающие таблицу БД с именем KM_PROJECT.

2) Второй класс сущностей называется KM_ProjectInfoStatus и отобразить таблицу БД с именем KM_PROJECT_INFO_STATUS.

Таким образом, второе представляет собой конкретное поле первого (состояние строки, представленное экземпляром класса KM_ProjectInfo). Infact у меня есть что-то вроде этого:

1) KM_ProjectInfo класс:

@Entity 
@Table(name = "KM_PROJECT") 
public class KM_ProjectInfo implements Serializable { 

    @Id 
    @GeneratedValue 
    private Long idProjectInfo; 

    @Column(name = "name") 
    private String name; 

    @Column(name = "technology") 
    private String technology; 

    @ManyToOne 
    @JoinColumn(name = "idCountry") 
    private KMCountry country; 

    @Column(name = "power") 
    private long power; 

    @Column(name = "cod") 
    private String cod; 

    @ManyToOne 
    @JoinColumn(name = "idProjectInfoStatus") 
    private KM_ProjectInfoStatus status; 

    // GETTERS & SETTERS 

} 

2) KM_ProjectInfoStatus:

@Entity 
@Table(name = "KM_PROJECT_INFO_STATUS") 
public class KM_ProjectInfoStatus implements Serializable { 

    @Id 
    @GeneratedValue 
    private Long idProjectInfoStatus; 

    @Column(name = "foldertech") 
    private Long foldertech; 

    @Column(name = "folderproject") 
    private Long folderproject; 

    // GETTERS & SETTERS 

} 

Итак, как вы можете видеть в предыдущем фрагменте KM_ProjectInfoStatuss - это поле KM_ProjectInfo, потому что я хочу что он содержит первичный ключ этой таблицы в качестве внешнего ключа.

В логике моего приложения, я хочу, что в одном ряду KM_PROJECT таблицы (так в один экземпляр класса объекта KM_ProjectInfo) связан один ряд с KM_PROJECT_INFO_STATUS (один экземпляр KM_ProjectInfoStatus класс сущности), поскольку он представляет конкретный статус для строки KM_PROJECT.

В моем коде у меня есть:

@ManyToOne 
@JoinColumn(name = "idProjectInfoStatus") 
private KM_ProjectInfoStatus status; 

, но я думаю, что это неправильно, потому что в одной строке моей первой таблицы она связана с конкретной одной строкой второй таблицы. Но, возможно, мне не хватает чего-то о том, как работает Hibernate.

Помогите мне понять, чего у меня нет? Что это работает? Почему у меня есть @ManyToOne вместо @OneToOne?

Tnx

ответ

2

Все зависит от того, как вы хотите моделировать вещи. С точки зрения структуры базы данных, OneToOne и ManyToOne осуществляются таким же образом:

  • Один или более JoinColumns, что делает внешний ключ, ссылающийся на первичный ключ другой таблицы.

Так оба решения правильно отобразить в базе данных, но это зависит, если вы хотите, чтобы несколько KM_ProjectInfo, чтобы указать на то же KM_ProjectInfoStatus или разрешить только одного.

Обратите внимание, что, даже если вы объявите OneToOne, вы все равно можете указать несколько KM_ProjectInfo, указывающих на тот же KM_ProjectInfoStatus, если вы не будете правильно управлять Hibernate.

Здесь вы не объявляла обратную связь, но если вы сделали, то заявление должно было бы быть иначе:

  • В случае OneToOne, вы бы KM_ProjectInfo член
  • В случае OneToMany (реверсе ManyToOne), вы бы Collection<KM_ProjectInfo> член
+0

mmm, значит, вы имеете в виду, что использование экземпляра KM_ProjectInfo OneToMany может быть связано с тем же экземпляром KM_ProjectInfoStatus? И если я использую OneToOne, одна строка KM_ProjectInfo связана с одним конкретным экземпляром KM_ProjectInfoStatus, и никакой другой экземпляр (строка таблицы) KM_ProjectInfo не может быть связан с этим экземпляром (строкой) KM_ProjectInfoStatus? Это смысл вашего объяснения? – AndreaNobili

0

из описания кажется вы хотите иметь один-к-одному. То есть объект проекта должен иметь свой собственный статус, не разделяемый каким-либо другим проектом. Вы можете достичь этого, используя @OneToOne, как показано ниже.

@Entity 
@Table(name = "KM_PROJECT") 
public class KM_ProjectInfo implements Serializable { 

    @Id 
    @GeneratedValue 
    private Long idProjectInfo; 

    @OneToOne 
    @JoinColumn(name = "idProjectInfoStatus") 
    private KM_ProjectInfoStatus status; 
} 

@Entity 
@Table(name = "KM_PROJECT_INFO_STATUS") 
public class KM_ProjectInfoStatus implements Serializable { 

    @Id 
    @GeneratedValue 
    private Long idProjectInfoStatus; 

    @OneToOne(mappedBy="idProjectInfoStatus") 
    private KM_ProjectInfo project; 
} 

Таким образом, у вас может быть определенный статус для KM_PROJECT.

Возвращаясь к @ManyToOne, вы захотите получить это, если хотите поделиться одним и тем же статусом с несколькими проектами, но это не то, что вы хотите в своем случае. Здесь я попытался объяснить сопоставления здесь One-to-One mapping.

Смежные вопросы