2015-01-07 4 views
0

рассмотреть следующую Pojos:JPA/OpenJPA слияния всегда вызывает SQL UPDATE на встроенных объектах

@Embeddable 
public class Info { 
    private String name; 
    public String getName(){ 
    return name; 
    } 
    public void setName(String name){ 
    this.name=name; 
    } 
} 

@Entity 
public class Person { 
    @Id 
    private long pid; 
    public Person(long pid){ 
    this.pid=pid; 
    } 

    @Embedded 
    private Info info = new Info(); 
    public Info getInfo(){ 
    return info; 
    } 
} 

и некоторый код доступа к нему

{ 

Person p = new Person(1); 
p.getInfo().setName("Foo"); 

EntityManager em = ... 

em.merge(p); // <-- SQL INSERT or UPDATE expected 

} 

следующие SQLs выполняется:

1-й запуск слияние() соответствует следующим (как ожидалось):

  • ВЫБОР p.name от человека, где р = 1 p.pid
  • INSERT INTO человека (PID, имя) VALUES (1, 'Foo')

2-й запуск слияния() не ниже, который является неожиданное:

  • ВЫБРАТЬ p.name от человека р, где имя p.pid = 1
  • UPDATE человек SET = 'Foo' WHERE PID = 1

Почему UPDATE произойдет во 2-м периоде ? хотя «Foo» по-прежнему равен «Foo» ?!

Если я не использую Info Встраиваемый, вместо того, чтобы поместить свойство «имя» в классе Person, 2-ой перспективе слияния() работает, как ожидалось: есть SELECT, но не UPDATE не выполняется

ответ

0

кажется как ошибка OpenJPA или недостающая функция для меня, если я переключусь на реализацию EclipseLink, все будет работать так, как ожидалось.

Кроме того, во время .merge (новый Entity()) на существующий идентификатор (но на отдельном объекте) все поля с разными значениями обновляются (также обнуляются) с использованием EclipseLink, тогда как в OpenJPA пустые поля не синхронизируются с базой данных. Итак, снова EclipseLink выполняет здесь, как и ожидалось.