假设我有两个实体User
和Sport
。我希望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();
我将在体育表中获得多个“篮球”和“足球”领域。如何防止?
提前致谢
答案 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的现有体育将在同一行中更新