我正在使用spring rest
处理网络服务,并使用spring data jpa
来保留我的模型。在这个例子中,我将实现可以具有多个活动的简单用户(由数据库中的关联表表示)。
拥有以下型号:
SQL TABLES
> user_detail <
id (int)
> activity <
id (int)
> user_activity <
user_id (int) | activity_id (int)
JAVA
@Entity
@table(name = "user_detail")
@Getter @Setter
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "user_activity",
joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "activity_id", referencedColumnName = "id"))
private Set<Activity> activities;
}
@Entity
@Getter @Setter
public class Activity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@ManyToMany(mappedBy = "activities", fetch = FetchType.EAGER)
private Set<User> users;
}
每个实体都有自己的crud repository
在编译时通过spring数据(通过代码生成)实现
@Repository
public interface ActivityRepository extends CrudRepository<Activity, Integer> {}
@Repository
public interface UserRepository extends CrudRepository<User, Integer> {}
通过所有这些,现在我能够get
(一个或全部),create
,update
或delete
一个活动和用户。上面的代码工作正常,但我有关于级联操作的问题。
鉴于以下documentation,@ManyToMany
应该没有级联操作,因为以下引文
默认为不进行级联操作。
但是,如果我加载1 user
1 activity
,然后remove
来自Set<Activity>
的此活动,则在保存时,它会删除用户与用户之间的链接关联表中的活动。它没有任何意义。由于没有定义的级联操作,因此应该没有效果。
出了什么问题?
编辑:此主题的处理方法是找到一种方法,使Set<Activity>
和@ManyToMany
提供的@Jointable
为read-only
。我找到的最近的方法是来自updatable=false
的{{1}},但在我的情况下是不可能的。
我也尝试过以下代码:
@JoinColumn
它没有解决问题。
编辑:也许这不可能吗?也许我应该在存储库中创建一个返回给定用户活动的特定方法?