У меня есть класс пользователя и класс электронной почты. Я использовал @OneToMany annotatioin, чтобы описать реальность, что один пользователь может иметь много писем и один адрес электронной почты назначен одному пользователю.JavaEE JPA синхронизирует объект с базой данных
Теперь проблема заключается в следующем: при создании пользователя и электронной почты и назначении электронной почты пользователю я пытаюсь найти способ, с помощью которого JPA получает инициализацию набора сообщений электронной почты. Обычно это нормально работает, когда я делаю em.find(User.class, "test");
Это не работает, когда я создаю пользователя. Атрибут emails
всегда имеет размер 0 или даже null. Но когда я создаю пользователя, а затем повторно развертываю свое приложение, а затем выполняю em.find(User.class, "test")
, атрибут электронной почты устанавливается правильно с размером 1, и я могу получить к нему доступ.
@Entity
public class User implements Serializable {
private String username;
private String password;
private Set<Email> emails;
@OneToMany(mappedBy = "user", fetch = FetchType.EAGER)
public Set<Email> getEmails() {
return emails;
}
public void setEmails(Set<Email> emails) {
this.emails = emails;
}
@Id
@Column(name = "Username")
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Basic
@Column(name = "Password")
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
-
@Entity
public class Email implements Serializable {
private int id;
private String email;
private User user;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "Id")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@ManyToOne
@JoinColumn(name = "user")
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Basic
@Column(name = "Email")
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
-
User user = new User();
user.setUsername("test");
user.setPassword("asdf");
em.persist(user);
Email e = new Email();
e.setEmail("[email protected]");
e.setUser(user);
em.persist(e);
return user;
после выполнения этих заявлений, атрибут пользователя emails
является нулевым (очевидно). Но странно, когда я делаю em.find(User.class, "test");
в другом методе, атрибут emails
имеет размер 0, даже если записи правильно вставлены в базу данных. Когда я сейчас перераспределяю свое приложение и снова вызываю em.find(User.class, "test");
, атрибут emails
имеет размер 1. Я уже пытался позвонить em.merge();
или em.refresh();
, который не сработал. Я использую glassfish 4.1.1. В качестве типа транзакции я использую JTA и eclipselink для реализации JPA.