Всегда ли мне нужно явно устанавливать вложенные объекты при сохранении основного объекта Hibernate? - PullRequest
2 голосов
/ 07 марта 2011

У меня есть человек класса

public Person() {
    //passports = new AutoPopulatingList<Passport>(Passport.class); 
    passports = new AutoPopulatingList<Passport>(new PassportFactory(this));
}


@Id
@Column(name = "PERSON_ID")
@GeneratedValue
 public Integer getId() {
  return id;
 }

@Column(name = "FIRST_NAME")
public String getFirstName() {
 return firstName;
}

@Column(name = "LAST_NAME")
public String getLastName() {
 return lastName;
}

@Column(name = "MONEY")
public Double getMoney() {
 return money;
}

@OneToMany(cascade = CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="person")
@JoinColumn(name="person_id")
public List<Passport> getPassports(){
      return this.passports;
 }

Паспорт класса

@Id
@Column(name = "passport_id")
@GeneratedValue
public Integer getPassport_id() {
    return passport_id;
}

@Column(name = "country_issue")
public String getCountry_issue() {
    return country_issue;
}


@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="person_id")
public Person getPerson(){
    return person;

}

Это двунаправленные однотомные отношения.

Изначально я копил вот так

session.save(person);

и это не было сохранение person_id в паспортной таблице, тогда кто-то сказал мне сделать это

for(Passport passport : person.getPassports())
      {
          passport.setPerson(person);
      }
 session.save(person);

Сделав так, это сработало !!.

Мой вопрос был таков: если я использую ElementFactory и устанавливаю объект person в паспорте там с помощью

public Object createElement(int index) {
    Passport passport = new Passport();
    passport.setPerson(person);
    return passport;

Тогда, почему я должен снова явно указать на человека, которого я презираю

Это класс Passportfactory, который я использую в autopopulateList

public class PassportFactory implements AutoPopulatingList.ElementFactory {
  private Person person;

  public PassportFactory(Person person) {
     this.person = person;
  }

  public Object createElement(int index) {
    Passport passport = new Passport();
    passport.setPerson(person);
    return passport;
  }
}

1 Ответ

0 голосов
/ 07 марта 2011

Да, двунаправленные ассоциации обрабатываются пользователем вручную (как вы показали)

...