有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Hibernate如何正确使用关系中的级联

我在SpringMVC应用程序中使用hibernate,对cascade有一个问题。我看到了许多类似的问题,但没有一个能回答我的问题。假设我有UserUserPosition对象User有一个UserPosition集合,还有一个UserPosition作为默认位置。结构如下所示:

用户:

@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private Collection<UserPosition> userPositionCollection;

public Collection<UserPosition> getUserPositionCollection() {
    return userPositionCollection;
}

public void setUserPositionCollection(Collection<UserPosition> collection) {
    this.userPositionCollection = collection;
}


 @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "default_User_Position_ID", referencedColumnName = "id")
private UserPosition defaultUserPosition;

public UserPosition getDefaultUserPosition() {
    return defaultUserPosition;
}

public void setDefaultUserPosition(UserPosition defaultUserPosition) {
    this.defaultUserPosition = defaultUserPosition;
}

用户位置:

@JoinColumn(name = "user_id", referencedColumnName = "id")
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
private User user;

public User getUser() {
    return user;
}

public void setUser(User user) {
    this.user = user;
}

@OneToOne(fetch = FetchType.LAZY, mappedBy = "defaultUserPosition", cascade = CascadeType.PERSIST)
private User defaultUserPosition;

public User getDefaultUserPosition() {
    return defaultUserPosition;
}

public void setDefaultUserPosition(User defaultUserPosition) {
    this.defaultUserPosition = defaultUserPosition;
}

现在,我的问题是使用cascade保存相关对象的最佳实践是什么。事实上,我混淆了这三种解决方案:

解决方案1:

User user = new User();
//some setters and getters 
UserPosition userPosition = new UserPosition();
//some setters and getters 
List<UserPosition> positionList = new ArrayList<>();
positionList.add(userPosition);
user.setDefaultUserPosition(userPosition);
user.setUserPositionCollection((Collection<UserPosition>) positionList );
session.persist(user)

解决方案2:

User user = new User();
//some setters and getters 
UserPosition userPosition = new UserPosition();
//some setters and getters 
userPosition.setUser(user);
userPosition.setDefaultUserPosition(user);
session.persist(userPosition)

解决方案3(前两种解决方案的组合):

User user = new User();
//some setters and getters 
UserPosition userPosition = new UserPosition();
//some setters and getters 
List<UserPosition> positionList = new ArrayList<>();
positionList.add(userPosition);
user.setDefaultUserPosition(userPosition);
user.setUserPositionCollection((Collection<UserPosition>) positionList );
userPosition.setUser(user);
userPosition.setDefaultUserPosition(user);
session.persist(user);

这对我很重要,所以请帮助我。哪种解决方案是正确的,在哪里应该是cascade属性?谢谢你抽出时间


共 (1) 个答案

  1. # 1 楼答案

    User是父实体,级联一个lways propagates from Parent to Child entities

    因此,用户关联成为:

    @OneToMany(mappedBy = "user", 
        fetch = FetchType.LAZY, 
        cascade = CascadeType.ALL, 
        orphanRemoval = true)
    private Collection<UserPosition> userPositionCollection;
    

    但是对于默认位置,用户成为关联的Child

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "default_User_Position_ID", referencedColumnName = "id")
    private UserPosition defaultUserPosition;
    

    UserPosition类中,情况正好相反:

    @JoinColumn(name = "user_id", referencedColumnName = "id")
    @ManyToOne(fetch = FetchType.LAZY)
    private User user;
    

    @OneToOne(fetch = FetchType.LAZY, 
        mappedBy = "defaultUserPosition", 
        cascade = CascadeType.PERSIST)
    private User defaultUserPosition;
    

    然后,您还必须添加以下实用程序方法,这些方法始终同步双方。它们进入User类:

    public void addUserPosition(UserPosition userPosition) {
        userPositionCollection.add(userPosition);
        userPosition.setUser(this);
    }
    
    public void addDefaultUserPosition(UserPosition userPosition) {
        defaultUserPosition = userPosition;
        userPosition.setDefaultUserPosition(this);
    }
    

    持久化逻辑变成:

    User user = new User();
    //some setters and getters 
    UserPosition userPosition = new UserPosition();
    //some setters and getters 
    
    user.addUserPosition(userPosition);
    user.setDefaultUserPosition(userPosition);
    
    session.persist(user);