2016-07-08 4 views
3

Я создал классы:Hibernate - создание классов из схемы

@Table(name = "FILE_SET") 
@Entity 
public class FileSet 
{ 
    @Id 
    @Column(name = "FileSetId") 
    private final long fileSetId; 

    @Column(name = "FileSetState") 
    private final int fileSetState; 

    @OneToMany(targetEntity = Variables.class) 
    private final Set<Variables> variables; 
} 

и

@Entity 
@Table(name = "VARIABLES") 
public class Variables 
{ 
    @Id 
    @Column(name = "VariablesId") 
    private final int variablesId; 

    @ManyToOne(targetEntity = FileSet.class) 
    @JoinColumn(name = "CurrentFileSetId") 
    private final long currentFileSetId; 

    @Column(name = "CurrentDevicesDictId") 
    private final long currentDevicesDictId; 
} 

И этот код Crating таблицы: https://zapodaj.net/b18d0afb396e5.png.html

Но я хотел бы иметь только "Переменные" и «FileSet», где CurrentFileSetId in Variables - это внешний ключ из FileSet. Что я делаю не так? В первый раз я использую спящий режим.

ответ

2

В OneToMany стороне добавить @JoinColumn(name = "CurrentFileSetId")

@OneToMany(targetEntity = Variables.class) 
@JoinColumn(name = "CurrentFileSetId") 
private final Set<Variables> variables; 

так, вместо создания JoinTable это создаст FK.

Вышеуказанный ответ действителен для однонаправленной связи.

Итак, чтобы сделать ответ полным, то есть в случае двунаправленной ассоциации, следующий должна быть кодом:

@ManyToOne(targetEntity = FileSet.class) 
@JoinColumn(name = "CurrentFileSetId") 
private final long currentFileSetId; 

and 

@OneToMany(targetEntity = Variables.class, mappedBy = "currentFileSetId") //this is the field name in FileSet class. 
private final Set<Variables> variables; 

Так в основном, аннотация @JoinColumn указует, что данное лицо является собственником отношений. В то время как в mappedBy мы предоставляем поле, которому принадлежат отношения.

+0

Имя ключа иностранного столбца является 'CurrentFileSetId'. –

+0

@ v.ladynev исправлено! – eatSleepCode

1

Думаю, что @ eatSleepCode ответ правильный. Но я хочу представить более общий подход к спячке.

Вы не должны использовать обычные поля внешнего ключа, такие как currentFileSetId - вместо этого используйте ассоциации с объектами. И вам не нужно использовать targetEntity = Variables.class, Hibernate использует его по умолчанию.

@Table(name = "FILE_SET") 
@Entity 
public class FileSet 
{ 
    @Id 
    @Column(name = "FileSetId") 
    private final long fileSetId; 

    @Column(name = "FileSetState") 
    private final int fileSetState; 

    @OneToMany(mappedBy = "currentFileSet") 
    private final Set<Variables> variables; 

} 

@Entity 
@Table(name = "VARIABLES") 
public class Variables 
{ 
    @Id 
    @Column(name = "VariablesId") 
    private final int variablesId; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "CurrentFileSetId") 
    private FileSet currentFileSet; 

} 

Если вы не хотите иметь ассоциацию FileSet на Variables части (по-прежнему имеющей CurrentFileSetId в качестве внешнего ключа):

@Table(name = "FILE_SET") 
@Entity 
public class FileSet 
{ 
    @Id 
    @Column(name = "FileSetId") 
    private final long fileSetId; 

    @Column(name = "FileSetState") 
    private final int fileSetState; 

    @OneToMany 
    @JoinColumn(name = "CurrentFileSetId") 
    private final Set<Variables> variables; 

} 

@Entity 
@Table(name = "VARIABLES") 
public class Variables 
{ 
    @Id 
    @Column(name = "VariablesId") 
    private final int variablesId; 

} 
+0

спасибо, теперь я понимаю, но почему вы используете FetchType ленивый? Это необходимо? – pustypawel

+0

@pustypawel По умолчанию Hibernate будет извлекать полностью 'FileSet', пока вы получите' Variables'. Конечно, Hibernate получит его из кеша первого уровня сеанса. Но мы используем такой «ленивый подход» в наших проектах, чтобы не получить много данных случайно. И, как я думаю, вам придется загружать 'FileSet' с' Variables' в редких ситуациях. –

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