Java Hibernate模型:设置子类的默认@manytone值

Java Hibernate模型:设置子类的默认@manytone值,java,hibernate,default-value,class-hierarchy,Java,Hibernate,Default Value,Class Hierarchy,我的类用户具有@manytone字段角色 @Entity @Table(name="USERS") @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorValue("ROLE_ADMIN") @DiscriminatorColumn (name="ROLENAME", discriminatorType= DiscriminatorType.STRING, length=20) public class Use

我的类用户具有@manytone字段角色

@Entity 
@Table(name="USERS")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorValue("ROLE_ADMIN")
@DiscriminatorColumn (name="ROLENAME", discriminatorType= DiscriminatorType.STRING, length=20)
public class User extends BaseEntity implements UserDetails {
    // all others fields like username, password,...

    @ManyToOne
    @JoinColumn(name = "role_id", referencedColumnName="id") 
    @NotNull(message = "ROLE field is mandatory")
    private Role role;

    //getter and setter
}
我有许多扩展用户的类:UserSeller、UserClient、UserOffice

@Entity
    @DiscriminatorValue("ROLE_SELLER")
    @AttributeOverride(name = "role", column = @Column(name = "role_id"))
    public class UserSeller extends User {

       //additional fields like CompanyId,...

       //getter & setter
    }
我有一个面板,可以插入/编辑/删除所有类型的用户, 但我也必须有n个面板:每种用户一个

当我在这些面板中时,我希望能够在没有 要将角色放在选择位置,但我希望将此角色设置为默认角色

•我试图在UserSeller中加入一名施工员

@Entity
@DiscriminatorValue("ROLE_SELLER")
@AttributeOverride(name = "role", column = @Column(name = "role_id"))
public class UserSeller extends User {

    @Transient
    RoleService roleService;

    @Transient
    User user = new User();


    public UserSeller()
    {
        super(); 
        try
        {
            this.setRole(roleService.getRole("ROLE_SELLER"));
        }
        catch (RecordNotFoundException e)
        {

        }
    }
但我得到了这个错误:

Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister
•我试图将用户对象传递给构造函数:

public UserSeller(User user)
在控制器中,我这样做:

 User user = new User();
 UserSeller seller = new UserSeller(user);
 model.addAttribute("seller", seller);
但我得到了这个错误:

实体:com.machinet.model.UserVenditore没有默认构造函数

如果,在UserSeller中,我再次声明了我得到的有关错误的角色字段 重新定义的列

最后,我发现这可能是我的解决方案 用户卖方类别:

@PrePersist
public void prePersist() {
        try
        {
            this.setRole(roleService.getRole("ROLE_SELLER"));
        }
        catch (RecordNotFoundException e)
        {

        }           
    }
但是当我在UserSeller面板中尝试添加一个新的卖家时,它不承担默认角色,验证失败

我想知道我该怎么做:我想要我的用户卖家,用户客户,。。。插入新记录时具有默认值

我真的需要在控制器中执行此操作吗?这是唯一的办法吗?因为对于像我这样的初学者来说,它看起来并不那么优雅:

UserVenditore venditore = new UserVenditore();
try
{
    venditore.setRole(roleService.getRole("ROLE_VENDITORE"));
}
catch (RecordNotFoundException ex)
{

}
model.addAttribute("venditore", venditore);
编辑:最后一个解决方案也不起作用:验证失败


谢谢你的建议

目前,我在ControllerClass中只找到了这个解决方案:

在@modeldattribute之前删除@Valid 我手动设置角色 我手动验证对象

@RequestMappingvalue=/add,method=RequestMethod.POST 公共字符串addingSeller@ModelAttribute用户卖方卖方, BindingResult结果,重定向属性重定向属性{

logger.info("IN: Seller/add-POST"); 

//set role
try
{
    seller.setRole(roleService.getRole("ROLE_SELLER"));
}
catch (RecordNotFoundException ex)
{

}        

//validation
validator.validate(seller, result);

if (result.hasErrors()) {
    logger.info("Seller-add error: " + result.toString());
    redirectAttrs.addFlashAttribute("org.springframework.validation.BindingResult.seller", result);            
    redirectAttrs.addFlashAttribute("seller", seller);

} else {

    try
    {
        SellerService.addSeller(seller);

        //message to the user
        String message = "Seller added!";           
        redirectAttrs.addFlashAttribute("message", message);
        redirectAttrs.addFlashAttribute("message_class", "alert-success");      
    }
    catch (DuplicateRecordException e)
    {
        //the username already exists

        //message to the user
        String message = "Already exists an user with this USERNAME";           
        redirectAttrs.addFlashAttribute("message", message);
        redirectAttrs.addFlashAttribute("message_class", "alert-danger");         

        redirectAttrs.addFlashAttribute("seller", seller);
    }
}   

return "redirect:/sellers/list";
}


另一方面,通常最好将模型和服务分开。在实体类中使用RoleService是一种糟糕的做法。谢谢@JamesB的建议。获得这些建议总是好的。另一个提示:推动所有逻辑来设置默认角色,并将卖家验证到SellerService中,这就是它的用途。想象一下,有另一段代码调用服务并希望应用相同的逻辑。