Выбор из двух таблиц в Hibernate - PullRequest
1 голос
/ 09 марта 2012

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

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

+------------+             +------------+ 
|computers   |             |categories  | 
+------------+             +------------+ 
|categoryId  |------------>|categoryId  | 
|computerId  |             |categoryName| 
|computerName|             +------------+ 
+------------+

Вот автоматически сгенерированные классы POJO:

@Table(name="computers", catalog="dbname") 
public class Computers  implements java.io.Serializable { 

    private Integer computerId; 
    private Categories categories; 
    private String computerName; 

    public Computers() { 
    } 

    public Computers(Categories categories, String computerName) { 
        this.categories = categories; 
        this.computerName = computerName; 
    } 

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

    public void setComputerId(Integer computerId) { 
        this.computerId = computerId; 
    } 

    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="categoryId", nullable=false) 
    public Categories getCategories() { 
        return this.categories; 
    } 

    public void setCategories(Categories categories) { 
        this.categories = categories; 
    } 

    @Column(name="computerName", nullable=false) 
    public String getComputerName() { 
        return this.computerName; 
    } 

    public void setComputerName(String computerName) { 
        this.computerName = computerName; 
    } 

} 



@Entity
@Table(name="categories"
    ,catalog="dbname"
) 
public class Categories  implements java.io.Serializable { 


     private Integer categoryId; 
     private String categoryName; 
     private Set<Computers> computerss = new HashSet<Computers>(0); 
     private Set<Customers> customerss = new HashSet<Customers>(0); 

    public Categories() { 
    } 

    public Categories(String categoryName) { 
        this.categoryName = categoryName; 
    } 
    public Categories(String categoryName, Set<Computers> computerss, Set<Customers> customerss) { 
       this.categoryName = categoryName; 
       this.computerss = computerss; 
       this.customerss = customerss; 
    } 

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

    public void setCategoryId(Integer categoryId) { 
        this.categoryId = categoryId; 
    } 

    @Column(name="categoryName", nullable=false) 
    public String getCategoryName() { 
        return this.categoryName; 
    } 

    public void setCategoryName(String categoryName) { 
        this.categoryName = categoryName; 
    } 
    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="categories") 
    public Set<Computers> getComputerss() { 
        return this.computerss; 
    } 

    public void setComputerss(Set<Computers> computerss) { 
        this.computerss = computerss; 
    } 
    @ManyToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="categories") 
    public Set<Customers> getCustomerss() { 
        return this.customerss; 
    } 

    public void setCustomerses(Set<Customers> customerss) { 
        this.customerss = customerss; 
    } 

Если я выбираю значения с помощью HQL-запроса from Computers (я помещаю их в список), я вижу ${computer.computerName}, но ни один из ${computer.categories.categoryName} не появляется.Я хочу, чтобы каждый categoryName был выбран по идентификатору.Все категории должны отображаться вместе с именами.SQL-запрос для этой задачи не составит труда написать, но я хочу использовать Hibernate и не очень хорошо его понимаю в данный момент.Я думал, что все, что мне нужно, это отображения, представленные в классах.Мой простой from Computers не подходит для такого выбора?Я не получаю ошибок, которые могли бы немного облегчить понимание того, что я делаю неправильно.Любая помощь будет оценена.

1 Ответ

3 голосов
/ 09 марта 2012

Помимо глобальной настройки плана выборки «Компьютеры для категорий» в качестве EAGER с использованием @ManyToOne(fetch=FetchType.EAGER) в метаданных сопоставления, вы также можете сохранять это отношение как ленивое и использовать извлекать соединение в HQL, чтобы охотно получить категории для конкретного варианта использования

  from Computers computer join fetch computer.categories

Затем категории возвращенного экземпляра Computers будут полностью инициализированы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...