首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不插入子

不插入子
EN

Stack Overflow用户
提问于 2015-01-18 22:03:40
回答 1查看 103关注 0票数 1

我在使用jpa存储库保存对象时遇到了困难。我有两个实体。一对一相关:

代码语言:javascript
复制
@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;

和钱包

代码语言:javascript
复制
@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;

在这种情况下,我有一个问题-- hibernate在添加新用户时没有保存钱包:

代码语言:javascript
复制
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:

代码语言:javascript
复制
@Override
@Transactional
public void addUser(UserDto userDto) {
userRepository.save(userConverter.convertToEntity(userDto));
}

其中保存是jpa方法。

编辑:

代码语言:javascript
复制
  public void addUser(UserDto userDto) {    
            User user = userConverter.convertToEntity(userDto);
            Wallet wallet = walletConverter.convertToEntity(userDto.getWallet());
            user.setWallet(wallet);
            userRepository.save(user);        

    }

还有很奇怪的事:

代码语言:javascript
复制
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表中没有用户trail =)

编辑。我希望快到了):

我想让钱包成为用户和纸张的主人,因此,根据你的建议,我编辑了一些实体:

代码语言:javascript
复制
@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;

和用户:

代码语言:javascript
复制
@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,用户得到了它!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-19 02:53:29

mappedBy基本上意味着我不是relationship的所有者,key在另一边。把mappedBy放在双方都意味着没有人是关系的所有者。

理论

使用映射注释(如@OneToOne@OneToMany@ManyToMany)的bi-directional relationship属性。此属性允许您引用来自双方的关联实体。如果" X“与"Y”有关联,那么你可以从Y得到X,从X得到Y。

MappedBy向hibernate发出信号,表示关系的关键在另一边。

注释@JoinColumn表示该实体是关系的所有者。也就是说,对应的表有一个列,该列带有引用表的外键,而属性mappedBy则表示这一侧的实体与关系相反,所有者驻留在“其他”实体中。

实战

代码语言:javascript
复制
@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注释的,所以它表明这不是所有者,所有者是X(注释的字段)。name属性告诉Hibernate在哪里查找有关FK映射的信息(在X中有一个getY()方法)。不会在Y中创建其他字段。

改进将在上面的代码中完成

@LazyCollection:

定义@ManyToMany和@OneToMany关联上的lazyness选项。LazyCollectionOption可以是真(集合是惰性的,在访问其状态时将被加载)

User.Java实体更改可降至以下

代码语言:javascript
复制
@OneToOne(cascade = CascadeType.ALL)
private Wallet wallet;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28015321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档