2015-01-18 2 views
1

У меня проблемы с сохранением объектов с репозиториями jpa. У меня два объекта. Один к одному, связанные:Ребенок не вставлен

@Entity(name="USER") 
public class User { 
@Id 
@GeneratedValue 
@Column(name = "USER_ID") 
private Long userId; 
private String username; 


@OneToOne(mappedBy = "user", cascade = CascadeType.ALL) 
@PrimaryKeyJoinColumn 
@LazyCollection(LazyCollectionOption.FALSE) 
private Wallet wallet; 

и бумажнику

@Entity(name = "WALLET") 
public class Wallet implements Serializable { 

@Id 
@GeneratedValue 
@Column(name = "WALLET_ID") 
private Long id; 

@OneToMany(mappedBy = "wallet") 
@Cascade({org.hibernate.annotations.CascadeType.ALL}) 
@LazyCollection(LazyCollectionOption.FALSE) 
private List<Paper> papers; 


@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
@PrimaryKeyJoinColumn 
private User user; 

У меня есть проблема с этой ситуацией - спящий режим не спасает бумажник, когда я добавляю новый пользователь:

public String addUser(@PathVariable("userName") String userName) { 
UserDto userDto = new UserDto(); 
userDto.setUsername(userName); 
WalletDto walletDto = new WalletDto(); 
userDto.setWalletDto(walletDto); 
userService.addUser(userDto); 
return userDto.toString(); 
} 

и addUser:

@Override 
@Transactional 
public void addUser(UserDto userDto) { 
userRepository.save(userConverter.convertToEntity(userDto)); 
} 

где save - это метод jpa.

EDIT:

public void addUser(UserDto userDto) {  
      User user = userConverter.convertToEntity(userDto); 
      Wallet wallet = walletConverter.convertToEntity(userDto.getWallet()); 
      user.setWallet(wallet); 
      userRepository.save(user);   

    } 

и действительно странная вещь:

12:30:06,619 DEBUG EntityPrinter:121 - com.private.model.Wallet{id=6, papers=null, user=com.private.model.User#7} 
12:30:06,619 DEBUG EntityPrinter:121 - com.private.model.User{username=xyzasew, userId=7, wallet=com.private.model.Wallet#6} 

и в Wallet таблице нет пользователей след =)

Edit. Почти там я надеюсь =):

diagram

Я хочу, чтобы бумажник, чтобы быть хозяином пользователя и бумаги, в соответствии с Вашими советами я eddited НЕМНОГО сущности:

@Entity(name = "WALLET") 
public class Wallet implements Serializable { 

@Id 
@GeneratedValue 
@Column(name = "WALLET_ID") 
private Long id; 

@OneToMany(mappedBy = "wallet", cascade = CascadeType.ALL) 
@LazyCollection(LazyCollectionOption.FALSE) 
private List<Paper> papers; 


@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "wallet") 
private User user; 

и пользователь:

@Entity(name="USER") 
public class User { 
@Id 
@GeneratedValue 
@Column(name = "USER_ID") 
private Long userId; 
private String username; 


@OneToOne(cascade = CascadeType.ALL) 
private Wallet wallet; 

однако у кошелька все еще нет user_id, и пользователь получил его!

+0

В вашем 'userConverter' - вы устанавливаете обе части ассоциации? I.E. вы устанавливаете 'wallet.user' свой экземпляр' user'? – bedrin

+0

ну - нет, но как я могу установить кошелек, где нет идентификатора [поскольку еще не сохранен]? – iie

+0

просто установите ссылку. В вашем карточном кошельке является владельцем ассоциации, а не используется. Или переместите mappedBy из пользователя в кошелек – bedrin

ответ

1

mappedBy в основном означает, что я не являюсь владельцем relationship, key находится на другой стороне. Помещение mappedBy с обеих сторон означает, что никто не является владельцем отношений.

Теоретически

Используя "mappedBy" атрибут отображения аннотаций (как @OneToOne, @OneToMany, @ManyToMany) для bi-directional relationship. Этот атрибут позволяет ссылаться на связанные объекты с обеих сторон. Если «X» имеет связь с «Y», вы можете получить X из Y и Y из X.

MappedBy сигнализирует о спящем режиме, что ключ для отношений находится на другой стороне.

Аннотация @JoinColumn указывает, что это лицо является владельцем отношений. То есть соответствующая таблица имеет столбец с внешним ключом в ссылочной таблице, тогда как атрибут mappedBy указывает, что объект в этой стороне является обратным отношению, а владелец находится в «другом» объекте.

Практически

@Entity 
public class X implements Serializable { 
    @OneToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name="y_fk") 
    public Y getY() { 
     ... 
    } 

@Entity 
public class Y implements Serializable { 
    @OneToOne(mappedBy = "y") 
    public X getX() { 
    ... 
} 

Поскольку это помечается mappedBy это показывает, что это не владелец, а также о том, что Владелец Х (поле, которое имеет аннотацию). name указывает Hibernate, где можно найти информацию о картировании FK (внутри X есть метод getY()). Никакие дополнительные поля будут созданы в Y.

Улучшения, которые будут сделано в приведенной выше коде

@LazyCollection:

определяет возможность ленивости на @ManyToMany и @OneToMany ассоциаций , LazyCollectionOption может быть TRUE (коллекция ленива и будет загружена, когда его состояние доступно)

изменения User.Java сущностей может быть уменьшен ниже

@OneToOne(cascade = CascadeType.ALL) 
private Wallet wallet; 
+0

Я сделал то же, но все еще не USER_ID в таблице кошелька, однако вставка была сделана в обеих таблицах. – iie

+0

+ Пользователь имеет три поля: user_id, username, wallet_wallet_id и bidrectional отношения с Wallet. Я хотел, чтобы у Кошелька были walle_id, user_id и paper_id. Я немного испортил! – iie

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