2014-09-20 2 views
0

Я использую последнюю версию Hibernate Tools от JBoss Studio/Eclipse для генерации Java POJO из моей схемы базы данных.Инструменты для спящего режима - заказ POJO

Когда есть метод get, который получает дополнительные объекты, я хочу, чтобы они возвращались в определенном порядке. Очевидно, что я могу просто отредактировать файл класса, однако эти изменения будут потеряны, если эти файлы будут повторно сгенерированы, если произойдут какие-либо изменения схемы.

Исследование показало, что должно быть возможно добавить эти параметры, используя конфигурацию hibernate reverse engineering XML или, возможно, файл hibmate hbm xml. Я не могу заставить их работать, и я надеюсь, что кто-то может предоставить пример конфигурации, который будет работать.

Я создал очень простую БД, чтобы проиллюстрировать проблему.

SQL Schema:

-- 
-- Table structure for table `pupil` 
-- 

DROP TABLE IF EXISTS `pupil`; 
/*!40101 SET @saved_cs_client  = @@character_set_client */; 
/*!40101 SET character_set_client = utf8 */; 
CREATE TABLE `pupil` (
    `ID` int(11) NOT NULL, 
    `school_id` int(11) NOT NULL, 
    `forename` varchar(100) NOT NULL, 
    `surname` varchar(100) NOT NULL, 
    `gender` enum('M','F') NOT NULL, 
    PRIMARY KEY (`ID`), 
    KEY `fk_pupils_schools_idx` (`school_id`), 
    CONSTRAINT `fk_pupils_schools` FOREIGN KEY (`school_id`) REFERENCES `school` (`ID`)  ON DELETE NO ACTION ON UPDATE NO ACTION) 
    ENGINE=InnoDB DEFAULT CHARSET=latin1; 
/*!40101 SET character_set_client = @saved_cs_client */; 

-- 
-- Table structure for table `school` 
-- 

    DROP TABLE IF EXISTS `school`; 
/*!40101 SET @saved_cs_client  = @@character_set_client */; 
/*!40101 SET character_set_client = utf8 */; 
CREATE TABLE `school` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(200) DEFAULT NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
/*!40101 SET character_set_client = @saved_cs_client */; 

Это приводит к двум POJOs.

Pupil.java

package hibernateExample.db; 
// Generated 20-Sep-2014 15:34:31 by Hibernate Tools 4.0.0 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToOne; 
import javax.persistence.Table; 

/** 
* Pupil generated by hbm2java 
*/ 
@Entity 
@Table(name = "pupil", catalog = "test") 
public class Pupil implements java.io.Serializable { 

    private int id; 
    private School school; 
    private String forename; 
    private String surname; 
    private String gender; 

    public Pupil() { 
    } 

    public Pupil(int id, School school, String forename, String surname, 
      String gender) { 
     this.id = id; 
     this.school = school; 
     this.forename = forename; 
     this.surname = surname; 
     this.gender = gender; 
    } 

    @Id 
    @Column(name = "ID", unique = true, nullable = false) 
    public int getId() { 
     return this.id; 
    } 

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

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "school_id", nullable = false) 
    public School getSchool() { 
     return this.school; 
    } 

    public void setSchool(School school) { 
     this.school = school; 
    } 

    @Column(name = "forename", nullable = false, length = 100) 
    public String getForename() { 
     return this.forename; 
    } 

    public void setForename(String forename) { 
     this.forename = forename; 
    } 

    @Column(name = "surname", nullable = false, length = 100) 
    public String getSurname() { 
     return this.surname; 
    } 

    public void setSurname(String surname) { 
     this.surname = surname; 
    } 

    @Column(name = "gender", nullable = false, length = 2) 
    public String getGender() { 
     return this.gender; 
    } 

    public void setGender(String gender) { 
     this.gender = gender; 
    } 

} 

School.java. Метод getPupils должен иметь добавление OrderBy, добавленное в создании POJO. Возможно, это должен быть список, а не набор?

package hibernateExample.db; 
// Generated 20-Sep-2014 15:34:31 by Hibernate Tools 4.0.0 

import java.util.HashSet; 
import java.util.Set; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.GeneratedValue; 
import static javax.persistence.GenerationType.IDENTITY; 
import javax.persistence.Id; 
import javax.persistence.OneToMany; 
import javax.persistence.Table; 

/** 
* School generated by hbm2java 
*/ 
@Entity 
@Table(name = "school", catalog = "test") 
public class School implements java.io.Serializable { 

    private Integer id; 
    private String name; 
    private Set<Pupil> pupils = new HashSet<Pupil>(0); 

    public School() { 
    } 

    public School(String name, Set<Pupil> pupils) { 
     this.name = name; 
     this.pupils = pupils; 
    } 

    @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; 
    } 

    @Column(name = "name", length = 200) 
    public String getName() { 
     return this.name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "school") 
    public Set<Pupil> getPupils() { 
     return this.pupils; 
    } 

    public void setPupils(Set<Pupil> pupils) { 
     this.pupils = pupils; 
    } 

} 

Благодаря

+0

@OrderBy аннотации будет достаточно, даже если это список или набор. Какой результат вы получили? http://www.javacodegeeks.com/2012/04/hibernate-tip-sort-and-order.html – user23123412

+0

@ user23123412, как я могу добавить эту аннотацию в точке генерации POJO? Несколько примеров, которые я нашел в Интернете, похоже, не имеют никакого эффекта, и, похоже, нет выхода в eclipse, чтобы помочь отладить там, где может возникнуть проблема – hedgehog14

ответ

0

Пример для добавления аннотаций с помощью обратного проектирования XML: Вы можете увидеть, как легко подправить Мете области видимости класса атрибут объявления в примере ниже.

<table name="organization"> 
     <meta attribute="scope-class">@Proxy(lazy=false) public</meta> 
     <meta attribute="extra-import">org.hibernate.annotations.Proxy</meta> 
     ....rest of config..... 
</table> 

Вы можете на уровне поля, используя атрибут field-field. Полные мета атрибуты на этом link

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