Wymuszenie powstania Entity podczas tworzenia innej

0

Hej

Chciałem zbudować taki model w którym podczas tworzenia Entity User powstawałaby również inne Entity Address które byłoby w relacji OneToMany.
Czytałem że można to zrobić poprzez CascadeType.PERSIST ale coś mi nie wychodzi :( Podczas tworzenia obiektu User w bazie nie tworzy się wpis w tabeli Loan.
Może przedstawię jak to robię:

Entity User:

@Entity
@Table(name="USERS")
public class User extends AbstractModel{
	
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="USER_ID")
	private long userId;
	

	@OneToMany(mappedBy="createdBy", fetch=FetchType.LAZY, cascade=CascadeType.PERSIST)
        private Set<Address> loans = new HashSet<Address>();
 

oraz Entity Address:

 
@Entity
@Table(name = "ADDRESS")
public class Address {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "ADDRESS_ID")
	private long addressId;

	@ManyToOne(cascade=CascadeType.PERSIST)
	@JoinColumn(name="CREATED_BY_ID")
	private User createdBy;

Gdy zapisuję Entity User niestety Address się nie zapisuje :/

Może ktoś poradzi?:)

0

Ech, następny który tępo kopiuje z jakiegoś tutoriala bez zrozumienia. Gdybyś ROZUMIAŁ każdą lnijkę kodu który pokazałeś to byś wiedział w czym problem. Czy rozumiesz to:

@OneToMany(mappedBy="createdBy", fetch=FetchType.LAZY, cascade=CascadeType.PERSIST)

A konkretnie to:

@OneToMany(mappedBy="createdBy"

?
Odpowiedź brzmi nie, nie rozumiesz, bo inaczej nie miałbyś problemu z którym tu przyszedłeś. "mappedBy" określa właściciela powiązania. Właściciel ma to do siebie że zmiana "z jego strony" jest propagowana, a zmiana z drugiej strony nie jest. Jakbyś stworzył Address i ustawił mu Usera w polu createdBy to taki user zostałby automatycznie utworzony (gdyby nie istniał) w trakcie zapisywania do bazy tego Addressu.

0

Ja chyba się trochę zakręciłem i już nic nie rozumiem...to jest relacja bi-directional czyli w dwie strony. czyli w User mam onetomany mapowane na Usera którego tworze w Address czyli powinno zadziałac...I to nie jest zewrżnięte z tutoriala...Własna inwencja (chyba dlatego nie działa).

Jeżeli mappedBy użyję w Entity Address to na co mam mapować wówczas w klasie User?

Jeżeli w Klasie Address zrobie:

 
	@OneToOne(cascade=CascadeType.PERSIST)
	@PrimaryKeyJoinColumn
	private Address address

to i tak przy tworzeniu User nie dostanę wpisu do Address.

Próbuję na różne sposoby a i tak nic :/

0

Ok, teraz dopiero popatrzyłem dokładnie na twój kod.

  1. @OneToOne(cascade=CascadeType.PERSIST) ? a nie ManyToOne? Bo teraz to robisz jakieś jaja.
  2. Użyj Set<Loan> a nie List
0

To oczywiście była literówka....Nadal nic...zamieniłem na set'a ale nadal nic się nie dzieje...Poprawiłem również mój główny post...

0

Ale to przecież z bazami danych nie ma nic wspólnego. Mi to wygląda na jakąś Javę, więc tu przenoszę.

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