Java Hibernate模型:设置子类的默认@manytone值
我的类用户具有@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
@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中,这就是它的用途。想象一下,有另一段代码调用服务并希望应用相同的逻辑。