为什么我运行这段代码:
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...
}
<小时/>
编辑:
我想我忘记了 Student
实体的 @OneToMany
注释中的 fetch
。但是当我设置为 fetch=FetchType.LAZY
时,我在编辑后再次得到 null,并从数据库中获取编辑后的对象。当设置 fetch=FetchType.EAGER
mailList
字段不为空时。为什么?
最佳答案
问题出在 OpenJPA,当我在实体的某些属性上使用 fetch=FetchType.LAZY
时。问题在于实体的生命周期。所有实体都必须重新附加到持久性上下文。
同样的问题在这里:OpenJPA - lazy fetching does not work在这里:What's the lazy strategy and how does it work?
关于java - 为什么我在关系字段中得到空值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19351877/