2016-03-10 2 views
1

У меня есть класс пользователя и класс электронной почты. Я использовал @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.

ответ

1

Вы должны добавить письмо в User, а также и merge пользователя, если вы делаете это в два этапа, или (возможно, потребуется каскад = CascadeType.ALL) просто положить его в User для начала и persistUser, если вы делаете это за один шаг.

User user = new User(); 
Set<Email> emails = new HashSet<Email>(); 
user.setEmails(emails); 
user.setUsername("test"); 
user.setPassword("asdf"); 

Email e = new Email(); 
e.setEmail("[email protected]"); 
e.setUser(user); 

emails.add(e); 
em.persist(user); 

return user; 
0

Вам необходимо установить обе стороны любых двунаправленных отношений, JPA не сделает это за вас. Если вы этого не сделаете, то неустановленная сторона не будет отражать то, что находится в базе данных, до тех пор, пока она не будет перезагружена/обновлена ​​из базы данных. Вы можете принудительно обновить, используя em.refresh (user), но обычно лучше избегать попадания в базу данных и просто добавлять электронную почту в список адресов электронной почты пользователя.

Смежные вопросы