2013-10-05 4 views
1

Я использую реализацию JPA EclipseLink и сервер MySQL для слоя сохранения моего приложения. Моя проблема заключается в том, что объект, который уже был сохранен и уже имеет идентификатор, вставляется во второй раз через отношения «много-к-одному» с CascadeType.All.JPA сохраняет тот же объект дважды при использовании CascadeType.ALL

Здесь объекты:

@Entity 
@Table(name = "messages") 
public class Message extends DbObject { 

    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "user_id") 
    public User author; 

    public String message = ""; 

    public Timestamp timestamp; 

     // Getters and setters removed .... 
} 


@Entity 
@Table(name = "users") 
public class User extends DbObject { 

    private String name; 

    // Getters and setters removed .... 
} 


@MappedSuperclass 
public abstract class DbObject { 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    private long id; 

    public long getId() { 
     return id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 
} 

Когда я запускаю следующий код, то у меня есть две записи в моей таблице «пользователей». Но я просто хочу назначить уже существующего пользователя объекту Message, а не создавать нового пользователя.

User user = getCurrentUser(); // The user object is already persistent 

Message msg = new Message(); 
msg.setUser(user); 
EntityManager em = createEntityManager(); 
em.getTransaction().begin(); 
em.persist(msg); 
em.getTransaction().commit(); 
em.close(); 

ответ

1

Пользователь отсоединяется от EntityManager вы используете, чтобы сохраняться сообщение, и с каскадом не проходят установить на связи с пользователем, JPA требует, чтобы сохраняться также происходить на вашем отдельностоящий пользователя. Параметры: A) прочитайте его, используя текущую постоянство, чтобы он управлялся. Persist - это не-op для управляемых объектов, кроме каскада. B) удалите все каскады в сообщении Message-> user C) используйте слияние вместо сохранения для экземпляра сообщения. Слияние все равно будет сохраняться, но будет правильно скопировать пользовательское состояние в управляемый пользовательский экземпляр.

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