JPA composite bidirectional

0

Witam,

Mam problemy mapowania obiektu w POJO przy wykorzystaniu bidirectionala.

@Entity
@Table(name="person")
public class PersonOpen extends APerson implements Serializable{
	private static final long serialVersionUID = -6923989340498878558L;

	@Id
	@TableGenerator(name="PERSON_GEN", table="SEQUENCE_TABLE", 
	pkColumnName="TABLE_NAME", valueColumnName="SEQ_COUNT", pkColumnValue="Person", allocationSize = 1)
	@GeneratedValue(strategy=GenerationType.TABLE, generator="PERSON_GEN")
	@Column(name = "id_person")
	private Long idPerson;

@OneToMany(mappedBy="person",orphanRemoval = true, fetch = FetchType.EAGER, cascade = CascadeType.ALL) // mappedBy="person",
	//@JoinColumn(name = "id_person",referencedColumnName="id_person")
	private List<DataSurname> surnameList;
 
@Entity 
@Table(name="data_surname")
public class DataSurname implements IData, Serializable{
	private static final long serialVersionUID = 3178801372622548842L;

	@EmbeddedId
	private TestID pk;

	@ManyToOne
	@JoinColumn(name = "id_person", referencedColumnName = "id_person")
	@MapsId("person")
	private Person person;
	
	@ManyToOne(cascade= {CascadeType.PERSIST, CascadeType.MERGE} )
	@JoinColumn(name="id_dictionary",referencedColumnName="id")
	@MapsId("dictionary")
	private DictionarySurname idDictionary;
@Embeddable
public class TestID implements Serializable{
	Long person;
	Long dictionary;

Przy próbie zapisu do bazy obiektu Person nie przypisuje do POJO klucza obcego danej osoby. Zdaje mi się iż bidirectional powinien podmapować obiekt do DataSurname... chyba że ja czegoś nie ogarniam...

0

Może napisz taki pseudo-test, który pokazuje czego oczekujesz. JPA samo nie ustawia referencji między obiektami

0

Zdaje sie, że JPA podczas zapisywania obiektu Person, troszczy się tylko o mapowanie na "pierwszym poziomie", czyli listę rekordów jawne wskazanych adnotacją

@OneToMany

zapisze, ale już tego, że obiekty typu DataSurname są powiązane z encją Person, do której należą już nie potrafi samodzielnie wywnioskować. Samemu musisz się o to zatroszczyć, aby przy dodawaniu obiektów DataSurname do obiektu Person ustawiać każdemu z dodawanych elementów DataSurname relację (referencję) do obiektu Person, do którego dodajesz obiekt DataSurname. (Nie wiem czy nie brzmi to zbyt zawile, ale mam nadzieję, że zrozumiesz). Aby nie musieć ustawiać tej relacji obiektom DataSurname za każdym razem przed dodaniem go do listy obiektu Person możesz to zautomatyzować, aby każdemu dodawanemu obiektowi do listy automatycznie przypisywać relację do tego obiektu Person, do którego dodajesz obiekt DataSurname. Zautomatyzować poprzez modyfikację metody, za pomocą której dodajesz każdy obiekt DataSurname, a więc wyglądałoby to tak:

public void addDataSurname(DataSurname dataSurname) {
    // nie pisz poniższej linijki, jeśli chcesz żeby NullPointerException informował Cię o błędzie w kodzie
    // albo obsłuż nulla jakoś inaczej, bo tak to chyba nie wypada
    // if (dataSurname == null) return;
     if (surnameList == null) 
         phoneNumbers = new ArrayList<DataSurname>();          
        
     surnameList.add(dataSurname);
     dataSurname.setPerson(this);
}

Edit: Tyle, że znalazłem to rozwiązanie w 1 minutę na stackoverflow, więc warto najpierw samemu poszukać, a tak sie składa, że mniej więcej przetłumaczyłem po części twoje ostatnie zdanie na angielski, wpisałem do Google i odpowiedź byłą na pierwszej pozycji, aięc warto poszukać w necie zanim się zapyta :)
http://stackoverflow.com/questions/814474/jpa-not-saving-foreign-key-to-onetomany-relation

1 użytkowników online, w tym zalogowanych: 0, gości: 1