簡體   English   中英

使用注釋休眠一對多映射; 我正在嘗試使用外鍵關聯將用戶ID保存在另一個表中。

[英]Hibernate One-to-Many Mapping Using Annotations; I'm trying to use foreign key association to save a user id in another table.

我無法完成這項工作。 我也嘗試過使用聯接表,但是結果是一樣的。 我需要在表中顯示的用戶ID不需要。

這是我創建實體的方式。

對於User和UserRole,我使用了一個聯接表,它可以工作。 我曾嘗試對Commission進行相同的操作,但沒有成功(聯接表仍然為空),因此我嘗試使用外鍵關聯進行如下操作。

用戶:

@Entity
@Table(name="USERS")
public class User implements Serializable{

/**
 * serialVersionUID
 */
private static final long serialVersionUID = 1L;

@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;

@NotEmpty
@Column(name="USERNAME", unique=true, nullable=false)
private String username;

@NotEmpty
@Column(name="PASSWORD", nullable=false)
private String password;

@NotEmpty
@Column(name="FIRST_NAME", nullable=false)
private String firstName;

@NotEmpty
@Column(name="LAST_NAME", nullable=false)
private String lastName;

@NotEmpty
@Column(name="EMAIL", nullable=false)
private String email;

@NotEmpty
@ManyToMany(targetEntity=UserRole.class, fetch = FetchType.LAZY)
@JoinTable(name = "USERS_USER_ROLE", 
         joinColumns = { @JoinColumn(name = "USER_ID") }, 
         inverseJoinColumns = { @JoinColumn(name = "USER_ROLE_ID") })
private Set<UserRole> userRoles = new HashSet<UserRole>();

@OneToMany(fetch = FetchType.LAZY, mappedBy="user") 
private Set<Commission> commissions;

//getters and setters

佣金:

@Entity
@Table(name="COMMISSIONS")
public class Commission implements Serializable{

/**
 * serialVersionUID
 */
private static final long serialVersionUID = 1L;

@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;

@NotEmpty
@Column(name="ORDER_NAME", unique=true, nullable=false)
private String orderName;

@NotEmpty
@Column(name="ORDER_DETAILS", unique=true, nullable=false)
private String orderDetails;

@Column(name="ORDER_STATUS", unique=true, nullable=false)
private String orderStatus;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "USER_ID", nullable = false)
private User user;

//getters and setters

UserRole:

@Entity
@Table(name="USER_ROLE")
public class UserRole implements Serializable{

/**
 * serialVersionUID
 */
private static final long serialVersionUID = 1L;

@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id; 

@Column(name="ROLE", length=15, unique=true, nullable=true)
private String role = UserRoleType.USER.getUserRoleType();  // getUserRoleType is defined in an enum with 'ADMIN', 'DBA', 'USER'

//getters and setters

在UserDAO和CommissionDAO中,我使用了SessionFactory來保存實體。

從由UserDAO和CommissionDAO擴展的抽象類中摘錄。

@Autowired
private SessionFactory sessionFactory;

protected Session getSession(){
    return sessionFactory.getCurrentSession();
}

public void persist(T entity) {
    getSession().save(entity);
}

當我創建一個新用戶時,一切正常。 聯接表中已添加了正確的ID。 但是...當我添加新的佣金時,佣金本身會添加到佣金表中,但user_id仍為null。

我是新來的冬眠者,有了我的這個“項目”,我想我可能會想不到的更多。

也許問題出在代碼中的其他地方而不是這里?

無論如何,我有點束手無策,可以使用您的專業知識人員。 干杯!

感謝Rossi Robinsion。 就是這樣

我錯過了將用戶與我的佣金控制器關聯的想法。 這是以前。

@RequestMapping(value = { "/newcommission" }, method = RequestMethod.POST)
public String saveCommission(@Valid Commission commission, BindingResult result, ModelMap model) {

    if (result.hasErrors()) {
        return "commissioncreation";
    }

    if(!commissionService.isUserOrderNameUnique(commission.getId(), commission.getOrderName())){
        FieldError orderNameError =new FieldError("commission","orderName", 
                messageSource.getMessage("non.unique.orderName", 
                        new String[]{commission.getOrderName()}, Locale.getDefault()));
        result.addError(orderNameError);
        return "commissioncreation";
    }

    commissionService.saveCommission(commission);

    model.addAttribute("success", "Your commission was successfully created.");
    model.addAttribute("loggedinuser", getPrincipal());
    return "commissioncreationsuccess";
}

這是之后。

@RequestMapping(value = { "/newcommission" }, method = RequestMethod.POST)
public String saveCommission(@Valid Commission commission, BindingResult result, ModelMap model) {

    if (result.hasErrors()) {
        return "commissioncreation";
    }

    if(!commissionService.isUserOrderNameUnique(commission.getId(), commission.getOrderName())){
        FieldError orderNameError =new FieldError("commission","orderName", 
                messageSource.getMessage("non.unique.orderName", 
                        new String[]{commission.getOrderName()}, Locale.getDefault()));
        result.addError(orderNameError);
        return "commissioncreation";
    }

    User user = userService.findByUsername(getPrincipal()); // associated the user properly.
    commission.setUser(user);

    commissionService.saveCommission(commission);

    model.addAttribute("success", "Your commission was successfully created.");
    model.addAttribute("loggedinuser", getPrincipal());
    return "commissioncreationsuccess";
}

我不知道我怎么會錯過這個...

謝了哥們!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM