2017-02-09 8 views
2

У меня есть небольшое приложение, которое отвечает за сохранение данных в базе данных. Для этой цели я использую Hibernate. Ниже мой код:Hibernate не заполняет вторую таблицу, когда выполняется сопоставление один-к-одному.

класс пользователя

@Entity 
@Table(name = "USERS") 
@Transactional 
public class User implements Serializable{ 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "USER_ID") 
private int userId; 

@Column(name = "FIRST_NAME") 
private String firstName; 

@Column(name = "SURNAME") 
private String surname; 

@Column(name = "AGE") 
private int age; 

@Column(name = "EMAIL") 
private String email; 

@OneToOne(fetch = FetchType.LAZY, mappedBy = "user", cascade = CascadeType.ALL) 
private Address address; 

public User() { 

} 

public User(String firstName, String secondName, int age, String email) { 
    this.firstName = firstName; 
    this.surname = secondName; 
    this.age = age; 
    this.email = email; 
} 

// GETTERS/SETTERS 

Адрес класса

@Entity 
@Table(name = "ADDRESS") 
@Transactional 
public class Address implements Serializable{ 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

@GenericGenerator(name = "generator", strategy = "foreign", parameters = @Parameter(name = "property", value = "user")) 
@Id 
@GeneratedValue(generator = "generator") 
@Column(name = "USER_ID", unique = true, nullable = false) 
private int addressId; 

@Column(name = "STREET") 
private String street; 

@Column(name = "STREET_NUMBER") 
private String streetNumber; 

@Column(name = "FLAT_NUMBER") 
private String flatNumber; 

@Column(name = "POSTAL_CODE") 
private String postalCode; 

@Column(name = "CITY") 
private String city; 

@Column(name = "COUNTRY") 
private String country; 

@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
@PrimaryKeyJoinColumn(name = "USER_ID") 
private User user; 


public Address() { 

} 

public Address(String street, String streetNumber, String flatNumber, String postalCode, String city, String country) { 
    this.street = street; 
    this.streetNumber = streetNumber; 
    this.flatNumber = flatNumber; 
    this.postalCode = postalCode; 
    this.city = city; 
    this.country = country; 
} 

//GETTERS/SETTERS 

И когда я выполняю save() метод, который отвечает за сохранение данных в этих двух таблицах только для пользователей таблицы заполняется.

Я нашел это решение Hibernate @OneToOne with Shared Primary Key(bidirectional). Dependent entity not persisted in DB.

, но он не работает для меня.

Я использую:

  • Hibernate 4.3.6.Final
  • Spring 4.3.6.RELEASE

ответ

1

Ваш адрес класс должен быть закодирован следующим образом (при условии, что адрес должен быть созданный с тем же идентификатором пользователя, где генерируется идентификатор):

@Id 
@Column(name = "USER_ID", unique = true, nullable = false) 
private int addressId; 


@MapsId 
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
@JoinColumn(name = "USER_ID", referencedColumnName = "USER_ID") 
private User user; 

Во время Persist

User u = new User(); 
// populate u fields 

Address a = new Address(); 
a.setUser(u); 
// populate a fields 

session.persist(a); 
+0

Спасибо, это решение работает для меня. – user3552976

+0

Отлично. Рад, что смог помочь –