JPA不保存重复项,指向已存在的字段

时间:2017-11-23 14:51:51

标签: java hibernate jpa

假设我有两个实体UserSport。我希望JPA存储有关用户的数据和他最喜欢的运动列表。运动表不能包含重复项。每当我将用户添加到数据库(提供最喜欢的运动)时,他的数据都会被保存,如果他指定的运动存在于体育表中,则会指向现有的行(可以在单独的表中),如果不是 - 运动中的新行被建造。我试过以下但没有成功:

体育实体

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long sportId;

    //@Column(unique = true)
    private String sportName;

    @ManyToMany(mappedBy = "sports")
    private Set<User> users;

用户实体

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long userId;

private String username;

@ManyToMany(cascade = CascadeType.ALL)
Set<Sport> sports;

当我保存多个像这样创建的用户时:

User user1 = new UserBuilder("user1").sports(new Sport("basketball"), new Sport("football")).build();
    User user2 = new UserBuilder("user2").sports(new Sport("tennis")).build();
    User user3 = new UserBuilder("user3").sports(new Sport("football")).build();

我将在体育表中获得多个“篮球”和“足球”领域。如何防止?

提前致谢

1 个答案:

答案 0 :(得分:0)

看起来你正在寻找从用户到体育的一对多关系。

为此,将用户的主键保存为运动表中的外键。

就像

   @Id  
     @GeneratedValue(strategy = GenerationType.AUTO) 
     @Column(name ="sports_id" )  
     private Long sportId;  
     @Column(name ="sports_name" )  
     private String sportName; 
     @ManyToOne 
     @JoinColumn(name= "user_id")    
     private User user; 


@Id  
@GeneratedValue(strategy =       GenerationType.AUTO)  
   @Column(name ="user_id" )  
     private Long userId;  
    @Column(name ="user_name" )  
     private String username;     
    @ManyToMany(mappedby="user", cascade = CascadeType.ALL)  
    Set<Sport>  sports;

为避免重复使用用户和体育的主键同时更新用户将被更新,并且将新添加主键为空的新体育,并且具有id的现有体育将在同一行中更新