我是 Spring boot 的新手,如果洗掉了 forgein 鍵的物體而不洗掉與其鏈接的整個物體,我希望能夠洗掉它的值;我在我的例子中解釋了一個擁有帳戶的人可以同時是作者和玩家,所以如果洗掉一個作者我想洗掉它在表帳戶中的參考而不洗掉整個帳戶,因為這個帳戶仍然可以指向播放器我在互聯網上搜索我找到了 cascadetype 但它會洗掉整個帳戶!
先感謝您!這是我的物體
@Table(name = "account")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Account implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
@SequenceGenerator(name = "sequenceGenerator")
@Column(name = "ID")
private Long id;
@ManyToOne
@JoinColumn(name = "Author")
private Author author;
@ManyToOne
@JoinColumn(name = "Player")
private Player player;
//attributs, getters & setters
}
@Table(name = "player")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Player implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
@SequenceGenerator(name = "sequenceGenerator")
@Column(name = "ID")
private Long id;
//attributs, getters & setters
}
//ma.myapp.usersgestion.domain.Author
@Table(name = "author")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Author implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
@SequenceGenerator(name = "sequenceGenerator")
@Column(name = "ID")
private Long id;
@OneToMany(mappedBy = "author")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@JsonIgnoreProperties(value = { "player", "author"}, allowSetters = true)
private Set<Account> accounts = new HashSet<>();
//attributs, getters & setters
}
更新
我正在使用 jhipster(帶有 React 的彈簧啟動)和 h2 資料庫(帶有基于磁盤的持久性)
//AuthorResource.java
@RestController
@RequestMapping("/api")
@Transactional
public class AuthorResource {
private final Logger log = LoggerFactory.getLogger(AuthorResource.class);
private static final String ENTITY_NAME = "author";
@Value("${jhipster.clientApp.name}")
private String applicationName;
private final AuthorRepository authorRepository;
public AuthorResource(AuthorRepository authorRepository) {
this.authorRepository = authorRepository;
}
/**
* {@code DELETE /authors/:id} : delete the "id" author.
*
* @param id the id of the author to delete.
* @return the {@link ResponseEntity} with status {@code 204 (NO_CONTENT)}.
*/
@DeleteMapping("/authors/{id}")
public ResponseEntity<Void> deleteAuthor(@PathVariable Long id) {
log.debug("REST request to delete Author : {}", id);
authorRepository.deleteById(id);
return ResponseEntity
.noContent()
.headers(HeaderUtil.createEntityDeletionAlert(applicationName, true, ENTITY_NAME, id.toString()))
.build();
}
//...
}
//AuthorRepository
@SuppressWarnings("unused")
@Repository
public interface AuthorRepository extends JpaRepository<Author, Long> {}
uj5u.com熱心網友回復:
在您的物體類作者中添加以下內容:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "author", cascade = { CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.PERSIST })
private Set<Account> accounts;
我已經CascadeType.REMOVE從串列中省略了 cascadetype。這將防止Account在洗掉相關Author物體時也被洗掉。
編輯:
如果上述解決方案不知何故不起作用,那么您也可以嘗試在該欄位@OnDelete(action = OnDeleteAction.NO_ACTION)上方添加。accounts
@OnDelete是一個hibernate特定的注解。
編輯2:
如果上面提供的解決方案都不起作用,那么您還可以考慮制作一個帶javax.persistence.@PreRemove注釋的方法,手動設定author每個與Accountnull 相關的欄位。您將此方法放在Author類中。帶有注釋的方法@PreRemove將始終在洗掉物體之前運行。因此,Author您可以使用以下方法將所有 author_id 欄位設定為空。
@PreRemove
public void deleteAuthor(){
this.getAccounts().forEach(account -> account.setAuthor(null));
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/432634.html
