0

なぜ私はこのコードを実行すると:

Student st = new Student();
st.setFirstName("First");
st.setLastName("Last");
st.setIndexNr("11");
st.setStudentPK(new StudentPK(0, user.getIdUser()));
studentFacade.create(st);

Mail m = new Mail();
m.setContent("con");
m.setRecipient("rec");
m.setIdMail(0);
mailFacade.create(m);

List<Mail> l = new ArrayList<Mail>();
l.add(m);
st.setMailList(l);
studentFacade.edit(st);     // st have mailList property set to l

stud=studentFacade.findByIndex("11"); //after edit and get student he has mailList equal null

オブジェクトを永続化して編集した後、OneToMany 関係のプロパティで null を取得するのはなぜですか?


データベースMySqlにはSTUDENT、テーブルとMAILテーブルがあります:

CREATE  TABLE IF NOT EXISTS `STUDENT` (
  `id_student` MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `first_name` VARCHAR(65) NULL ,
  `last_name` VARCHAR(65) NULL ,
  `index_nr` VARCHAR(45) NULL 
)
ENGINE = InnoDB

CREATE  TABLE IF NOT EXISTS `MAIL` (
 `id_mail` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
 `recipient` TEXT NULL ,
 `content` TEXT NULL ,
 `sender_student` MEDIUMINT UNSIGNED NULL ,
  PRIMARY KEY (`id_mail`) ,
  INDEX `fk_STUDENT_id_idx` (`sender_student` ASC) ,
  CONSTRAINT `fk_STUDENT`
 FOREIGN KEY (`sender_student` )
 REFERENCES `jkitaj`.`STUDENT` (`id_student` )
 ON DELETE CASCADE
 ON UPDATE CASCADE
)
ENGINE = InnoDB

データベースから、netbeans でエンティティを生成します。

@Entity
@Table(name = "STUDENT")
public class Student implements Serializable {
 private static final long serialVersionUID = 1L;
 @EmbeddedId
 protected StudentPK studentPK;
 @Size(max = 65)
 @Column(name = "first_name")
 private String firstName;
 @Size(max = 65)
 @Column(name = "last_name")
 private String lastName;
 @Size(max = 45)
 @Column(name = "index_nr")
 private String indexNr;
 @OneToMany(mappedBy = "senderStudent",fetch=FetchType.EAGER)
 private List<Mail> mailList;

 //getters, setters ...

}

public class Mail implements Serializable {
 private static final long serialVersionUID = 1L;
 @Id
 @GeneratedValue
 @Basic(optional = false)
 @Column(name = " id_mail")
 private Integer idMail;
 @Lob
 @Size(max = 65535)
 @Column(name = "recipient")
 private String recipient; 
 @Lob
 @Size(max = 65535)
 @Column(name = "content")
 private String content;
 @JoinColumn(name = "sender_student", referencedColumnName = "id_student")
 @ManyToOne
 private Student senderStudent;

 //getters, setters...
}

編集:

エンティティfetch@OneToMany注釈で忘れていると思います。Studentしかし、設定fetch=FetchType.LAZYすると、編集後に再びnullを取得し、データベースから編集されたオブジェクトを取得します。設定されたfetch=FetchType.EAGER mailListフィールドが null でない場合。なんで ?

4

2 に答える 2

1

fetch=FetchType.LAZYエンティティのいくつかのプロパティで使用すると、OpenJPA で問題が発生します。問題はエンティティのライフサイクルにありました。すべてのエンティティを永続化コンテキストに再接続する必要があります。

同じ問題がここにあります: OpenJPA - 遅延フェッチが機能しませんそしてここ:遅延戦略とは何ですか?

于 2013-10-22T21:37:20.937 に答える