【问题标题】:Do i always need to explicitly set sub objects while saving Hibernate main Object我是否总是需要在保存 Hibernate 主对象时显式设置子对象
【发布时间】:2011-03-07 12:20:10
【问题描述】:

我有班级人

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;

那为什么我要再次明确地把这个人设置为下流

这是我在 autopopulateList 中使用的 Passportfactory 类

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

【问题讨论】:

    标签: java hibernate spring jpa binding


    【解决方案1】:

    是的,双向关联由用户手动处理(就像您展示的那样)

    【讨论】:

    • 那么那里的 ElementFactory 用例是什么。它没有任何用处
    • @Pasha - 在 elementfactory 中,我看不到 person 的来源。它可能是一个不正确的人,或者为空。
    • @Pasha - 你能调试一下 1. 它不是 null 2. 它是你以后保存的同一个对象。
    • @Pasha - 只需放置一个断点或 System.out,然后进行比较。
    • 我添加了 logger.debug(person);在 PassportFactory 构造函数和 Session.save() 之前。他们有相同的 ID Person@1781288
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多