孩子没有被插入

时间:2015-01-18 22:03:41

标签: java hibernate jpa spring-data-jpa

我在使用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;

我遇到了这种情况的问题 - 当我添加新用户时,hibernate没有保存钱包:

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方法。

编辑:

  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}

并且在电子钱包表中没有用户跟踪=)

编辑。几乎在那里我希望=):

diagram

我希望钱包成为用户和纸张的主人,因此,根据您的建议我有点实体:

@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,用户得到了它!

1 个答案:

答案 0 :(得分:1)

mappedBy基本上意味着我不是relationship的所有者,key位于另一边。将mappedBy放在两边意味着没有人是这种关系的所有者。

<强>理论上

"mappedBy"使用映射注释的@OneToOne属性(如@OneToMany@ManyToManybi-directional relationship)。此属性允许您从两侧引用关联的实体。如果“X”与“Y”相关联,则可以从Y中获得X和从X获得Y.

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注释的,它表明这不是所有者,并且所有者是X(注释的字段)。 name属性告诉Hibernate在哪里可以找到有关FK映射的信息(在X内部有getY()方法)。在Y中不会创建其他字段。

上述代码中的改进

@LazyCollection:

  

定义@ManyToMany和@OneToMany上的lazyness选项   关联。 LazyCollectionOption可以为TRUE(该集合是懒惰的   并在访问其状态时加载

User.Java实体更改可以降低到

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