データベースã«ãƒ‡ãƒ¼ã‚¿ã‚’挿入ã™ã‚‹ãƒ—ãƒã‚°ãƒ©ãƒ を作æˆã—ã€ãƒ‡ãƒ¼ã‚¿ãŒæ—¢å˜ã®ãƒ‡ãƒ¼ã‚¿ã¨ç«¶åˆã™ã‚‹å ´åˆã« DataIntegrityViolationException をスãƒãƒ¼ã™ã‚‹ãŸã‚ã«ã€Java ã® Spring Framework を使用ã™ã‚‹ä¾‹ã‚’以下ã«ç¤ºã—ã¾ã™ã€‚Spring Framework を使ã†ã¨ã€DataIntegrityViolationException ã¯ä¸»ã« Spring Data JPA ã®æ“作ã§ç™ºç”Ÿã™ã‚‹ä¾‹å¤–ã§ã™ã€‚
ã¾ãšã€ä¾å˜æ€§ã¨ã—㦠Spring Data JPA をプãƒã‚¸ã‚§ã‚¯ãƒˆã«è¿½åŠ ã—ã¦ãã ã•ã„。Spring Boot を使用ã™ã‚‹å ´åˆã€ä»¥ä¸‹ã®ã‚ˆã†ã« Maven プãƒã‚¸ã‚§ã‚¯ãƒˆã®ä¾å˜é–¢ä¿‚ã«è¿½åŠ ã—ã¾ã™ã€‚
<dependencies>
<!-- ä»–ã®ä¾å˜é–¢ä¿‚ãŒã‚れã°ãれもå«ã‚ã‚‹ -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
次ã«ã€ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ã‚¯ãƒ©ã‚¹ã‚’作æˆã—ã¾ã™ã€‚例ã¨ã—ã¦ã€User エンティティを考ãˆã¦ã¿ã¾ã—ょã†ã€‚
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class User {
@Id
private Long id;
private String username;
// ä»–ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã‚„ã‚²ãƒƒã‚¿ãƒ¼ã‚»ãƒƒã‚¿ãƒ¼ã‚‚è¿½åŠ ã™ã‚‹
}
ãã—ã¦ã€UserRepository ã¨å‘¼ã°ã‚Œã‚‹ãƒªãƒã‚¸ãƒˆãƒªã‚¯ãƒ©ã‚¹ã‚’作æˆã—ã¾ã™ã€‚
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
// ユーザーåã§æ¤œç´¢ã™ã‚‹ãƒ¡ã‚½ãƒƒãƒ‰
User findByUsername(String username);
}
最後ã«ã€ãƒ‡ãƒ¼ã‚¿æŒ¿å…¥ã‚’行ã†ã‚µãƒ¼ãƒ“スクラスを作æˆã—ã¾ã™ã€‚
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.stereotype.Service;
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void insertUser(User user) {
try {
// ユーザーåã§æ¤œç´¢ã—ã€æ—¢ã«å˜åœ¨ã™ã‚‹å ´åˆã¯ä¾‹å¤–をスãƒãƒ¼
if (userRepository.findByUsername(user.getUsername()) != null) {
throw new DataIntegrityViolationException("Duplicate username");
}
// ユーザーãŒå˜åœ¨ã—ãªã„å ´åˆã¯ä¿å˜
userRepository.save(user);
} catch (DataIntegrityViolationException e) {
// é‡è¤‡ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã®å‡¦ç†
System.out.println("データ挿入エラー: " + e.getMessage());
}
}
}
ã“ã®ä¾‹ã§ã¯ã€UserRepository ã‹ã‚‰æ—¢ã«å˜åœ¨ã™ã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼åを検索ã—ã€å˜åœ¨ã™ã‚‹å ´åˆã¯ DataIntegrityViolationException をスãƒãƒ¼ã—ã¦ã„ã¾ã™ã€‚データベースã®ãƒ¦ãƒ‹ãƒ¼ã‚¯åˆ¶ç´„ã«é•åã™ã‚‹æ“作を行ã£ãŸå ´åˆã€Spring Data JPA 㯠DataIntegrityViolationException をスãƒãƒ¼ã—ã¾ã™ã€‚
ãƒ‡ãƒ¼ã‚¿ã®æ•´åˆæ€§ãƒã‚§ãƒƒã‚¯
ãƒ‡ãƒ¼ã‚¿ã®æ•´åˆæ€§ãƒã‚§ãƒƒã‚¯ã¯ã€ãƒ‡ãƒ¼ã‚¿ãŒã‚·ã‚¹ãƒ†ãƒ 内ã§ä¸€è²«æ€§ã‚’æŒã£ã¦ã„ã‚‹ã‹ã©ã†ã‹ã‚’確èªã™ã‚‹ãƒ—ãƒã‚»ã‚¹ã‚’指ã—ã¾ã™ã€‚ã“れã¯é€šå¸¸ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹å†…ã§å®Ÿè¡Œã•れるã“ã¨ãŒå¤šã„ã§ã™ãŒã€ä¸€èˆ¬çš„ãªãƒ—ãƒã‚°ãƒ©ãƒŸãƒ³ã‚°ã‚³ãƒ³ãƒ†ã‚ストã§ã‚‚é©ç”¨ã•れã¾ã™ã€‚ãƒ‡ãƒ¼ã‚¿ã®æ•´åˆæ€§ã¯ã€ãƒ‡ãƒ¼ã‚¿ãŒäºˆæƒ³ã©ãŠã‚Šã®å½¢ã§å˜åœ¨ã—ã€ãれã«å¯¾ã™ã‚‹æ“作ãŒäºˆæ¸¬é€šã‚Šã«è¡Œã‚れã¦ã„ã‚‹ã“ã¨ã‚’ä¿è¨¼ã™ã‚‹ãŸã‚ã«é‡è¦ã§ã™ã€‚
以下ã¯ã€ãƒ‡ãƒ¼ã‚¿ã®æ•´åˆæ€§ãƒã‚§ãƒƒã‚¯ã«é–¢ã™ã‚‹åŸºæœ¬çš„ãªè€ƒãˆæ–¹ã¨è§£èª¬ã§ã™ã€‚
- ä¸€æ„æ€§åˆ¶ç´„(Unique Constraint): データベースã«ãŠã„ã¦ã€ã‚る列ã«ä¸€æ„性制約をè¨ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“れã¯é‡è¤‡ã™ã‚‹å€¤ã‚’防ãŽã€ãƒ‡ãƒ¼ã‚¿ã®ä¸€è²«æ€§ã‚’確ä¿ã—ã¾ã™ã€‚上述ã®ä¾‹ã§ã¯ã€
UserRepositoryã§findByUsernameを用ã„ã¦ãƒ¦ãƒ¼ã‚¶ãƒ¼åã®é‡è¤‡ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦ã„ã¾ã™ã€‚ - 外部ã‚ー制約(Foreign Key Constraint): 関連ã™ã‚‹è¤‡æ•°ã®ãƒ†ãƒ¼ãƒ–ルãŒã‚ã‚‹å ´åˆã€å¤–部ã‚ー制約をè¨å®šã™ã‚‹ã“ã¨ã§ã€å‚ç…§ã•れるテーブルã®ãƒ‡ãƒ¼ã‚¿ãŒå˜åœ¨ã™ã‚‹å ´åˆã«ã®ã¿é–¢é€£ãƒ‡ãƒ¼ã‚¿ã‚’挿入ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ã“れã«ã‚ˆã‚Šã€é–¢é€£ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ã®æ•´åˆæ€§ã‚’ä¿ã¤ã“ã¨ãŒã§ãã¾ã™ã€‚
- トランザクションã®ä½¿ç”¨: データベーストランザクションを使用ã™ã‚‹ã“ã¨ã§ã€ä¸€é€£ã®æ“作をアトミックã«å®Ÿè¡Œã§ãã¾ã™ã€‚トランザクション内ã§ä¸€éƒ¨ã®æ“作ãŒå¤±æ•—ã—ãŸå ´åˆã€ã™ã¹ã¦ã®å¤‰æ›´ãŒãƒãƒ¼ãƒ«ãƒãƒƒã‚¯ã•れã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¯ä¸€è²«æ€§ã®ã‚ã‚‹çŠ¶æ…‹ã«æˆ»ã‚Šã¾ã™ã€‚
- カスタム例外ã®ä½¿ç”¨: カスタム例外を使用ã—ã¦ç‰¹å®šã®æ¡ä»¶ãŒæº€ãŸã•れãªã„å ´åˆã«ä¾‹å¤–をスãƒãƒ¼ã™ã‚‹ã“ã¨ã§ã€ç•°å¸¸ãªçŠ¶æ…‹ã‚’å‡¦ç†ã§ãã¾ã™ã€‚例ãˆã°ã€
DataIntegrityViolationExceptionを利用ã—ã¦ã€æ—¢å˜ã®ãƒ‡ãƒ¼ã‚¿ã¨ã®ç«¶åˆã‚’検知ã—ã¾ã—ãŸã€‚ - 一貫性ã®ç¢ºèª: 定期的ã«ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®ä¸€è²«æ€§ã‚’確èªã™ã‚‹ãƒ—ãƒã‚»ã‚¹ã‚’å°Žå…¥ã™ã‚‹ã“ã¨ã‚‚é‡è¦ã§ã™ã€‚ã“れã«ã¯ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã‚¸ãƒ§ãƒ–やテストãŒå«ã¾ã‚Œã¾ã™ã€‚
ãƒ‡ãƒ¼ã‚¿ã®æ•´åˆæ€§ãƒã‚§ãƒƒã‚¯ã¯ã€ã‚·ã‚¹ãƒ†ãƒ ãŒæ£ã—ãæ©Ÿèƒ½ã—ã€ãƒ‡ãƒ¼ã‚¿ãŒæ£ç¢ºã§ä¿¡é ¼æ€§ãŒã‚ã‚‹ã“ã¨ã‚’確ä¿ã™ã‚‹ãŸã‚ã«ä¸å¯æ¬ ã§ã™ã€‚異常ãªçŠ¶æ…‹ãŒæ¤œå‡ºã•れãŸå ´åˆã€ãれã«å¯¾å‡¦ã™ã‚‹ä»•組ã¿ã‚’æŒã¤ã“ã¨ãŒã‚·ã‚¹ãƒ†ãƒ ã®ä¿¡é ¼æ€§å‘上ã«å¯„与ã—ã¾ã™ã€‚
ãƒ‡ãƒ¼ã‚¿ã®æ•´åˆæ€§ãƒã‚§ãƒƒã‚¯ã¯ã€ã‚·ã‚¹ãƒ†ãƒ ãŒå®‰å®šã—ã¦ã‹ã¤ä¿¡é ¼æ€§ã®é«˜ã„å‹•ä½œã‚’ç¶æŒã™ã‚‹ä¸Šã§ã®ä¸å¯æ¬ ãªæ‰‹æ®µã§ã™ã€‚æ£ç¢ºãªãƒ‡ãƒ¼ã‚¿ãŒæä¾›ã•れã€äºˆæ¸¬å¯èƒ½ãªå‹•作ãŒç¢ºä¿ã•れるã“ã¨ã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚¨ã‚¯ã‚¹ãƒšãƒªã‚¨ãƒ³ã‚¹ã‚„システム全体ã®ãƒ‘フォーマンスã«ç›´çµã—ã¾ã™ã€‚
ãƒ‡ãƒ¼ã‚¿ã®æ•´åˆæ€§ãƒã‚§ãƒƒã‚¯ã‚’行ã†ã“ã¨ã§ã€æ½œåœ¨çš„ãªå•題を事å‰ã«æ¤œçŸ¥ã—ã€ãれã«å¯¾å‡¦ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚一貫性ãŒä¿ãŸã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã¯ã€ã‚·ã‚¹ãƒ†ãƒ å…¨ä½“ã®æ£å¸¸ãªæ©Ÿèƒ½ã‚’サãƒãƒ¼ãƒˆã—ã€ä¿¡é ¼æ€§ã®å‘上ã«å¯„与ã—ã¾ã™ã€‚é©åˆ‡ãªåˆ¶ç´„ã€ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®ä½¿ç”¨ã€ãã—ã¦é©åˆ‡ãªä¾‹å¤–処ç†ã¯ã€ãƒ‡ãƒ¼ã‚¿ã®æ•´åˆæ€§ã‚’確ä¿ã™ã‚‹ãŸã‚ã®å¼·åŠ›ãªæ‰‹æ®µã§ã™ã€‚
開発者やデータベース管ç†è€…ãŒãƒ‡ãƒ¼ã‚¿ã®æ•´åˆæ€§ã«å¯¾ã™ã‚‹æ³¨æ„ã‚’æ€ ã‚‰ãšã€ã‚·ã‚¹ãƒ†ãƒ ãŒç•°å¸¸ãªçŠ¶æ…‹ã«é™¥ã‚‹ãƒªã‚¹ã‚¯ã‚’最å°é™ã«æŠ‘ãˆã‚‹ã“ã¨ãŒé‡è¦ã§ã™ã€‚ã“れã«ã‚ˆã£ã¦ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒä¿¡é ¼ã§ãるデータã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã€ã‚·ã‚¹ãƒ†ãƒ ãŒå®‰å®šã—ã¦åŠ¹æžœçš„ã«é‹ç”¨ã•れるã“ã¨ãŒç¢ºä¿ã•れã¾ã™ã€‚
「019 例外ã¨ä¾‹å¤–処ç†ã€å•題集リスト
🎯 実習ã§ç†è§£ã‚’æ·±ã‚よã†
ã“ã®å†…容ã«ã¤ã„ã¦JavaDrillã§å®Ÿéš›ã«æ‰‹ã‚’å‹•ã‹ã—ã¦å¦ç¿’ã§ãã¾ã™


コメント