Java SQL Many2Many(关联表)与JPA一起为只读
我正在使用Java SQL Many2Many(关联表)与JPA一起为只读,java,jpa,spring-data,spring-data-jpa,cascade,Java,Jpa,Spring Data,Spring Data Jpa,Cascade,我正在使用springrest开发一个web服务,并使用springdatajpa来持久化我的模型。在本例中,我将实现可以有多个活动(由数据库中的关联表表示)的简单用户 具有以下型号: SQL表 有了所有这些,现在我能够获取(一个或全部),创建,更新或删除活动和用户。上面的代码运行良好,但我对级联操作有一个问题 鉴于以下情况,@manytomy应该没有级联操作,因为以下引用 默认情况下不级联任何操作 但是,如果我使用1活动加载1个用户,然后从集合中删除此活动,则保存时将删除用户与关联表中活动之间
springrest
开发一个web服务,并使用springdatajpa
来持久化我的模型。在本例中,我将实现可以有多个活动(由数据库中的关联表表示)的简单用户
具有以下型号:
SQL表
有了所有这些,现在我能够获取
(一个或全部),创建
,更新
或删除
活动和用户。上面的代码运行良好,但我对级联操作有一个问题
鉴于以下情况,@manytomy
应该没有级联操作,因为以下引用
默认情况下不级联任何操作
但是,如果我使用1活动加载1个用户
,然后从集合中删除此活动,则保存时将删除用户与关联表中活动之间的链接。它没有意义。因为没有定义的级联操作,所以应该没有效果。
怎么了?
编辑:本主题的任务是找到一种方法,使@manytomy
和@Jointable
提供的集成为只读的。我找到的最接近的方法是@JoinColumn
中的updateable=false
,但在我的情况下不可能
我还尝试了以下代码:
@ManyToMany(fetch = FetchType.EAGER)
joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id", updatable=false),
inverseJoinColumns = @JoinColumn(name = "activity_id", `referencedColumnName = "id", updatable=false))
private Set<Activity> activities;
@ManyToMany(fetch=FetchType.EAGER)
joinColumns=@JoinColumn(name=“user\u id”,referencedColumnName=“id”,updateable=false),
inverseJoinColumns=@JoinColumn(name=“activity\u id”,“referencedColumnName=“id”,updateable=false))
私人活动;
这并没有解决问题
编辑:这不可能吗?也许我应该在存储库中创建一个特定的方法来返回给定用户的活动?简单地防止修改集合怎么样<代码>私有集活动getActivities(){return Collections.unmodifiableSet(activities)}加载代码>模型,然后将其序列化为json并推送到前端。前端可以更新数据,然后将其放入Web服务(通过http方法put)。因此,我的Web服务将json反序列化到模型中并保存它。以您的方式阻止修改是不可能的。似乎没有人知道。up…………关于@JsonProperty(access=JsonProperty.access.READ_ONLY),它应该阻止反序列化。
@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;
}
@Repository
public interface ActivityRepository extends CrudRepository<Activity, Integer> {}
@Repository
public interface UserRepository extends CrudRepository<User, Integer> {}
@ManyToMany(fetch = FetchType.EAGER)
joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id", updatable=false),
inverseJoinColumns = @JoinColumn(name = "activity_id", `referencedColumnName = "id", updatable=false))
private Set<Activity> activities;