2016-02-08 3 views
-1

Я работаю с EclipseLink и JPA 2.0.Каскадирование не работает в oneToMany, с eclipseLink

Это мои 2 лица:

Feeder объектные:

@Entity 
@Table(name = "t_feeder") 
public class Feeder implements Serializable { 
private static final long serialVersionUID = 1L; 
//Staff 
@OneToMany(cascade = CascadeType.ALL, mappedBy = "idAttachedFeederFk") 
private Collection<Port> portCollection; 
//staff 
} 

Порт лицо:

@Entity 
@Table(name = "t_port") 
public class Port implements Serializable { 
//staff 
@JoinColumn(name = "id_attached_feeder_fk", referencedColumnName = "id") 
@ManyToOne 
private Feeder idAttachedFeederFk; 
//staff 
} 

И это мой код:

Feeder f = new Feeder(); 
//staff 
Port p = new Port(); 
p.setFeeder(f); 

save(feeder); //This is the function that calls finally persist. 

Проблема в том, что сохраняется только фидер, а не порт. Я что-то упускаю? И особенно, с какой стороны я должен упомянуть о каскадировании точно. Учитывая, что в моей базе данных порт таблица ссылается на фидер с внешним ключом.

EDIT

Этот простой фрагмент кода работает хорошо со мной:

public static void main(String[] args) { 
    Address a1 = new Address(); 
    a1.setAddress("madinah 0"); 

    Employee e1 = new Employee(); 
    e1.setName("houssem 0"); 
    e1.setAddressFk(a1); 

    saveEmplyee(e1); 
} 
+2

Да, вам не хватает того, что Feeder ничего не знает об этом новом Port.Call feeder.getPortCollection(). Add (p) перед сохранением и он будет работать. Я также рекомендовал бы инкапсулировать эти операции, как описано здесь. http://stackoverflow.com/questions/19840832/netbeans-not-filling-junction-table-using-hibernate/19855604#19855604 –

+0

Но фидер еще не управляется! –

+1

Извините, я не понимаю. Ответ, который я дал, верен. –

ответ

1

Я не знаю, почему вы бы ожидать, что она работает: вы пытаетесь сохранить новый экземпляр Feeder который не имеет никакого отношения к вновь созданному Порту.

Добавляя каскад в @OneToMany и вызова save(feeder) Eclipse, ссылка будет если бы ассоциация:

  1. Вставьте запись в податчик.
  2. Итерируйте коллекцию портов и вставьте соответствующие записи.

Как я уже отмечал, этот новый экземпляр фидера не имеет связанных с ним портов.

Что касается вашего простого примера, я предполагаю, что когда вы говорите, что это работает, как новый адрес, так и сотрудник были записаны в базу данных. Ожидается, что вы сообщили сотруднику об адресе (e1.setAddressFk(a1);) и сохранили сотрудника. Учитывая наличие соответствующей опции Cascade, оба объекта должны быть записаны в базу данных, как и ожидалось.

Учитывая это, должно быть очевидно, что вызов save(port) будет работать, если к стороне @ManyToOne будет добавлена ​​необходимая опция каскада.

Однако, если вы хотите позвонить в save(feeder), вам необходимо исправить эту модель. По существу, вы должны всегда гарантировать, что любая модель данных в памяти верна в любой момент времени, а именно: если первое условие ниже верно, то следует, что второе условие должно быть истинным.

Port p = new Port(); 
Feeder feeder = new Feeder(); 
p.setFeeder(f(); 

if(p.getFeeder().equals(f){ 
    //true 
} 

if(f.isAssociatedWithPort(p)){ 
    //bad --> returns false 
} 

Это, безусловно, лучшая практика в любом случае, но обеспечение корректности модели в памяти должно означать, что вы не переживайте тип вопроса вы видите в среде JPA.

Для обеспечения правильности модели данных в памяти необходимо инкапсулировать операции set/add.

+0

Мне очень грустно, что вы потратили много времени! –

+0

Может быть, вы можете разработать Ответ предоставлен правильно. Извините, я потратил свое время на то, чтобы помочь. –

+0

Я тестировал его много раз и не работал. Как может feeder == null, а затем вы вызываете feeder.removePort (порт)! –

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