gpt4 book ai didi

java - child 没有被插入

转载 作者:太空宇宙 更新时间:2023-11-04 06:16:43 25 4
gpt4 key购买 nike

我在使用 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,而用户得到了它!

最佳答案

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

理论上

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

MappedBy 向 hibernate 发出信号,表明关系的键位于另一侧。

注释@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:

defines the lazyness option on @ManyToMany and @OneToMany associations. LazyCollectionOption can be TRUE (the collection is lazy and will be loaded when its state is accessed)

User.Java实体更改可以减少到以下

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

关于java - child 没有被插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28015321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com