SpringMVC结合Hibernate保存List

walk_lai 发布于 2014/07/02 21:05
阅读 1K+
收藏 0

有两个实体类

@Entity
@Table(name="sec_privilege")
public class Privilege implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column
    @NotBlank(message = "name不能为空")
    private String name;
    @Column(name="p_desc")
    private String desc;
//getter and setter
....
}



@Entity
@Table(name = "sec_modules")
public class Module implements Serializable {

  @JoinTable(name = "sec_module_privilege", joinColumns = {@JoinColumn(name = "module_id")},
            inverseJoinColumns = {@JoinColumn(name = "privilege_id")})
    @ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    private List<Privilege> privileges=new ArrayList<Privilege>();
//其他属性省略
...
}



在使用SpringMVC时,由于传入到后台module中privileges的每个entity都只有一个ID,这样直接保存会出现验证失败

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is javax.validation.ConstraintViolationException: Validation failed for classes [com.lai.entities.Privilege] during update time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
	ConstraintViolationImpl{interpolatedMessage='name不能为空', propertyPath=name, rootBeanClass=class com.lai.entities.Privilege, messageTemplate='name不能为空'}
]



如果不重新从数据库中读取出数据的话,有没有好的解决方法呢?

加载中
0
小夭
小夭
既然业务要求name不能为空,你为什么保存的时候不给name赋值呢,而且感觉你这个模块和权限一对多,一般来说不应该在保存模块的时候保存权限,应该在保存权限的时候保存模块的ID,感觉你inverse的方向得变一下。
w
walk_lai
回复 @小夭 : 哈哈,是的,这就是一个在玩的示例程序。随便问问,就是想知道有没好的方法简单处理。没有就算了。。
w
walk_lai
回复 @小夭 : 但这样会更新了数据啊。。Privilege是已经保存在数据库里有的了。这里只是给关联上。如果没有name验证那一部分,那么只要有一个ID就能关联上,保存进去了。
小夭
小夭
回复 @walk_lai : 当然,既然“name不能为空”是必需条件,你保存的时候name又不赋值,只能在privilege初始化或构造函数的时候给name赋个初始默认的值了。
小夭
小夭
回复 @walk_lai : 感觉你又要马儿跑,又要马儿不吃草
w
walk_lai
这个只是一个示例,就是想知道如果出现这种一对多关联保存时,有验证不为空情况下有没有简单的方法,不用再去查数据库
返回顶部
顶部