首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >弹簧数据一对多映射

弹簧数据一对多映射
EN

Stack Overflow用户
提问于 2015-07-01 21:29:15
回答 2查看 22.4K关注 0票数 11

我尝试在Spring数据项目中配置OneToManyManyToOne映射,但存在一些问题。

所以我有两个实体:雇主和项目。一个雇主可以有很多项目。

实体类:

Employer.java

代码语言:javascript
运行
复制
@Entity
@Table (name="Employer")
public class Employer {

    @Id
    @SequenceGenerator(name="my_seq", sequenceName="GLOBAL_SEQUENCE")
    @GeneratedValue(strategy = GenerationType.SEQUENCE ,generator="my_seq")
    @Column (name="employer_id")
    private int id;

    @Column (name="name")
    private String name;

    @JoinColumn (name="employer_id")
    @OneToMany(mappedBy = "employer", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Set<Project> project = new HashSet<Project>();

    ......................
}   

Project.java

代码语言:javascript
运行
复制
@Entity
@Table (name="Project")
public class Project {

    @Id
    @SequenceGenerator(name="my_seq", sequenceName="GLOBAL_SEQUENCE")
    @GeneratedValue(strategy = GenerationType.SEQUENCE ,generator="my_seq")
    @Column (name="project_id")
    private int id;

    @Column (name="name")
    private String name;

    @ManyToOne
    @JoinColumn(name="employer_id", nullable = false)
    private Employer employer;
    ......................
}

存储库类:

代码语言:javascript
运行
复制
public interface EmployerRepository extends JpaRepository<Employer, Integer> {
}

public interface ProjectRepository extends JpaRepository<Project, Integer> {
}

服务:

代码语言:javascript
运行
复制
@Service
public class EmployerServiceImpl implements EmployerService {

    @Autowired
    private EmployerRepository employerRepository;

    @Override
    public List<Employer> getAllEmployers() {
        return employerRepository.findAll();
    }   
}

@Service
public class ProjectServiceImpl implements ProjectService {

    @Autowired
    private ProjectRepository projectRepository;

    @Override
    public List<Project> getAllProjects() {
        return projectRepository.findAll();
    }
}

主计长:

代码语言:javascript
运行
复制
@Controller
public class MainController {

    private EmployerService employerService;

    private ProjectService projectService;

    @Autowired(required = true)
    @Qualifier(value = "employerService")
    public void setEmployerService(EmployerService employerService) {
        this.employerService = employerService;
    }

    @Autowired(required = true)
    @Qualifier(value = "projectService")
    public void setProjectService(ProjectService projectService) {
        this.projectService = projectService;
    }


    @RequestMapping(value="/employers", method=RequestMethod.GET)
    public @ResponseBody List<Employer> getEmployers(@RequestParam(value = "name", required = false) String name) {
        return employerService.getAllEmployers();        
    }
    ..............................
}

雇主表:

代码语言:javascript
运行
复制
EMPLOYER_ID  .  NAME
......................
1            .  Google
2            .  Oracle
3            .  Facebook 

项目表:

代码语言:javascript
运行
复制
PROJECT_ID .    NAME            . EMPLOYER_ID
.......................................
1          . Create web site    .  1
2          . Create reporting   .  2
3          . Create web service .  3
4          . Fixing web site    .  1        

我期待着这样的事情:

代码语言:javascript
运行
复制
[{"id":1,"name":"Google","project":[{"id":1,"name":"Create web site"}, {"id":4,"name":"Fixing web site"}},
 {"id":2,"name":"Oracle","project":{"id":2,"name":"Create reporting"}},
 {"id":3,"name":"Facebook","project":{"id":3,"name":"Create web service"}}]

但是,来自getEmployers类的controller方法返回这个方法:

代码语言:javascript
运行
复制
[{"id":1,"name":"Oracle","project":[{"id":4,"name":"Fixing web site",
"employer":{"id":1,"name":"Oracle","project":[{"id":4,"name":"Fixing web site",
"employer":{"id":1,"name":"Oracle","project":[{"id":4,"name":"Fixing web site",
"employer":{"id":1,"name":"Oracle","project":[{"id":4,"name":"Fixing web site",
"employer":{"id":1,"name":"Oracle","project":[{"id":4,"name":"Fixing web site",
"employer":{"id":1,"name":"Oracle","project":[{"id":4,"name":"Fixing web site","employer":
...................

如果这个问题讨论了很多次,请原谅,但我没有找到合适的答案。

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-02 03:21:34

您在Employers和Projects之间有一个双向关联,另外,您已经将关联的两边配置为加载EAGERly (默认情况下,@ManyToOne关联被取为EAGERly,并且强制@OneToMany端也被取回EAGERly )。由于这种配置,当序列化框架加载Employers时,它会找到具有指向Employers的反向链接的有效Projects,并最终陷入循环循环。

为了获得所需的结果,必须将@ManyToOne端(在Project实体上)标记为LAZYly为@ManyTone(fetch = FetchType.LAZY)

票数 6
EN

Stack Overflow用户

发布于 2017-04-07 13:25:59

在关系的前一部分(即User.java类)中添加@JsonManagedReference:

代码语言:javascript
运行
复制
@Entity
public class User implements Serializable {

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

    @Column(name="name")
    private String name;

    @ManyToMany
    @JoinTable(name="users_roles",joinColumns=@JoinColumn(name = "user_fk"), inverseJoinColumns=@JoinColumn(name = "role_fk"))
    @JsonManagedReference
    private Set<Role> roles = new HashSet<Role>();

    ...

在关系的后面部分(即Role.java类)中添加@JsonBackReference:

代码语言:javascript
运行
复制
@Entity
public class Role implements Serializable {

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

    @ManyToMany(mappedBy="roles")
    @JsonBackReference
    private Set<User> users = new HashSet<User>();

    ...

这对我很管用。:-)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31172021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档