2013-08-24 3 views
3

Я пытаюсь получить код примера с сайта Morphia, работающий с очень небольшим успехом, мне было интересно, почему следующий фрагмент кода не удается?Выполнение кода примера Morphia/MongoDB

public class DBUtil { 
    private static Mongo mongo; 
    private static Datastore ds; 
    private static Morphia morphia; 

    public static void main(String[] args) { 
     try { 
      mongo = new MongoClient(new ServerAddress(Consts.DatabaseHost, 
        Consts.DatabasePort)); 

      morphia = new Morphia(); 

      morphia.map(Employee.class); 

      ds = morphia.createDatastore(mongo, Consts.DatabaseName); 

      DB db = Mongo.connect(new DBAddress(Consts.DatabaseHost, 
        Consts.DatabasePort, Consts.DatabaseName)); 

      ds.save(new Employee("Mister", "GOD", null, 0)); 

      // get an employee without a manager 
      Employee boss = ds.find(Employee.class).field("manager") 
        .equal(null).get(); 

      Key<Employee> scottsKey = ds.save(new Employee("Scott", 
        "Hernandez", ds.getKey(boss), 150 * 1000)); 

      // add Scott as an employee of his manager 
      UpdateResults<Employee> res = ds.update(
        boss, 
        ds.createUpdateOperations(Employee.class).add("underlings", 
          scottsKey)); 

      // get Scott's boss; the same as the one above. 
      Employee scottsBoss = ds.find(Employee.class) 
        .filter("underlings", scottsKey).get(); 

      for (Employee e : ds.find(Employee.class, "manager", boss)) 
        System.out.println(e); 

      } catch (UnknownHostException e1) { 
       e1.printStackTrace(); 
      } 
     } 
    } 

при использовании следующих для класса сотрудников?

@Entity("employees") 
class Employee { 
    public Employee(String firstName, String lastName, Object object, int i) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
     manager = new Key<Employee>(Employee.class, object); 
    } 

    // auto-generated, if not set (see ObjectId) 
    @Id ObjectId id; 

    // value types are automatically persisted 
    String firstName, lastName; 

    // only non-null values are stored 
    Long salary = null; 

    // by default fields are @Embedded 
    Address address; 

    //references can be saved without automatic loading 
    Key<Employee> manager; 

    //refs are stored**, and loaded automatically 
    @Reference List<Employee> underlings = new ArrayList<Employee>(); 

    // stored in one binary field 
    //@Serialized EncryptedReviews; 

    //fields can be renamed 
    @Property("started") Date startDate; 
    @Property("left") Date endDate; 

    //fields can be indexed for better performance 
    @Indexed boolean active = false; 

    //fields can loaded, but not saved 
    @NotSaved String readButNotStored; 

    //fields can be ignored (no load/save) 
    @Transient int notStored; 

    //not @Transient, will be ignored by Serialization/GWT for example. 
    transient boolean stored = true; 
} 

Однако при использовании вышеприведенного кода в строке «получить сотрудник без менеджера» не может найти что-нибудь и операция обновления вызывает исключение. Любая помощь будет оценена по достоинству?

ответ

2
  1. Я думаю, что это должно быть Employee boss = ds.find(Employee.class).field("manager").doesNotExist().get();

  2. Если я не ошибаюсь, юридические лица должны иметь не-арг конструктор.

PS: Если вы хотите, чтобы начать работу с полным проектом быстро, вы можете захотеть взглянуть на https://github.com/xeraa/mongouk2011

+0

Я скачал ваш проект и заметил, что она успешно сохраняет объекты в БД. С тех пор я использовал ваш код для отслеживания и понял, что мое использование GWT в проекте мешает, потому что я использую String для @Id, и это ломает морфию. v1.02 of morphia для GWT просто не работает. – hegsie

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