我的数据模型有一个实体网络。使用@OneToOne
,@ManyToOne
等相互引用的一组实体。其中一些引用定义为@NotNull
@Entity
@Table(name="UserDetails")
public class CustomUserDetails implements Serializable {
@NotNull
@JoinColumn(name="user_id", referencedColumnName="id")
@OneToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
private User user;
//.....
}
CustomUserDetailsService
处理从数据库中保存和加载CustomUserDetails
类的实例,UserDetailsRepository
是一个扩展CrudRepisitory
的接口。
当用户拨打/signup
时,我们要创建CustomUserDetails
的实例并将其保存到数据库。但是在服务器持久存在CustomUserDetails
的新实例之前,它必须创建类型为User
的新实例并将其保存到db(因为它定义为@NotNull
)。
在CustomUserDetailsService
中,在Controller中执行此操作是否有意义?还是在哪里?
我担心设计过于复杂,当数据模型变得更复杂时,不同实体的服务类之间会有很多交叉引用。
答案 0 :(得分:0)
遵循相同的风格,你应该有一个类似" UserService" 的类来处理用户的CRUD操作。 类 CustomUserDetailsService 应该包含 UserService 的成员,最好使用@Autowire注释。
在创建新的自定义用户详细信息之前,请调用 UserService 以创建新用户(如果需要)。
原则上它可以在此结束, CustomUserDetailsService 熟悉 UserService ,反之亦然。 您已定义 cascade = CascadeType.ALL ,因此如果删除用户,客户用户详细信息也会被删除。
确保 CustomUserDetails 的其他关系正确定义了它们的级联。