spring data jpa를 사용중에 문제가 있어 질문 드립니다.

903 views
Skip to first unread message

백일몽

unread,
Apr 15, 2013, 10:41:52 AM4/15/13
to ks...@googlegroups.com
안녕하세요.

spring data jpa를 사용중에 문제가 있어서 질문 드립니다.
현재 spring data jpa 1.3.0 릴리즈 버전에 구현체는 하이버네이트 3.6.10.Final
데이터베이스는 mysql 5.5 를 사용하고 있습니다.

대략 아래와 같은 코드가 있다고 하겠습니다.

User user = usersRepo.findByName(name)
if(user == null) {
 user = new User();
}
user.setAge(10);
usersRepo.save(user);

이런 코드가 있을 경우
name을 파라미터로 해서 디비에서 데이터를 가져오고없으면 새롭게 객체를 생성합니다.

마지막 save에서 객체의 상태를 보고 insert를 할 지 update를 할지 orm 판단해서 쿼리를 실행할텐데요.

문제는 분명 디비에 데이터가 있어서 user가 null이 아니라서 save 시에 update가 실행되어야 하는데 insert가 실행되어 디비 제약조건에 걸려 에러가 발생합니다.

어떤 문제가 있을지 의견 부탁드리겠습니다.

이상


JONG-IL SEOK

unread,
Apr 15, 2013, 11:01:45 AM4/15/13
to ks...@googlegroups.com
데이터베이스의 어떤 제약 조건에 걸린다는 건가요?

- name 이 unique key 인가요?
- id 는 어떤 값인가요? auto increment key 인가요?

오류 메시지를 보여주시면 얘기가 빠를 것 같습니다.

황용대

unread,
Apr 15, 2013, 11:07:12 AM4/15/13
to ks...@googlegroups.com
name 이 unique 키입니다.

id는 long의 자동증가 값이며 다음 타입을 따릅니다.

GenerationType.IDENTITY


name 이 이미 존재하는 상황에서 insert를 하려고 해서 발생하는 제약조건 예외입니다.
org.hibernate.exception.ConstraintViolationException

제가 집이라 정확한 스택 트레이스는 쓸 수가 없네요




2013. 4. 16., 오전 12:01, JONG-IL SEOK <dacl...@gmail.com> 작성:

--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 ksug+uns...@googlegroups.com에 이메일을 보내세요.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
http://groups.google.com/group/ksug?hl=ko-KR에서 그룹을 방문하세요.
더 많은 옵션을 보려면 https://groups.google.com/groups/opt_out을(를) 방문하세요.
 
 

Message has been deleted

YoungHan Kim

unread,
Apr 15, 2013, 11:33:47 AM4/15/13
to ks...@googlegroups.com
User도 보여주세요^^

2013년 4월 15일 월요일 오후 11시 41분 52초 UTC+9, 백일몽 님의 말:

백일몽

unread,
Apr 15, 2013, 9:17:09 PM4/15/13
to ks...@googlegroups.com
User는 대략 아래와 같은 형태입니다.

@Entity
@Cacheable
@Table(name = "users")
public class User implements Serializable {

    @Transient
    protected Logger logger = LoggerFactory.getLogger(getClass());

    private static final long serialVersionUID = -6961998490722195548L;

    public User(String nickname) {
        this();
        this.nickname = nickname;
    }

    public User() {
        super();
        this.reset();
    }

    public User(Long id) {
        this();
        this.id = id;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    public Long getId() {
        return id;
    }

    @Column(unique = true, nullable = false, length = 50)
    private String nickname;

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    @JsonIgnore
    @JoinColumn(name = "user_id")
    @OneToMany(targetEntity = App.class, cascade = CascadeType.REMOVE, fetch = FetchType.EAGER)
    private Set<App> apps;

    public Set<App> getApps() {
        return apps;
    }

    public void setApps(Set<App> tokens) {
        this.apps = tokens;
    }

    @JsonIgnore
    @Column(name = "updated_at")
    @Temporal(TemporalType.TIMESTAMP)
    private Date updatedAt;

    public void setUpdatedAt(Date updatedAt) {
        this.updatedAt = updatedAt;
    }

    public Date getUpdatedAt() {
        return updatedAt;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        result = prime * result + ((nickname == null) ? 0 : nickname.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        User other = (User) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        if (nickname == null) {
            if (other.nickname != null)
                return false;
        } else if (!nickname.equals(other.nickname))
            return false;
        return true;
    }
}

2013년 4월 16일 화요일 오전 12시 33분 47초 UTC+9, YoungHan Kim 님의 말:
Reply all
Reply to author
Forward
0 new messages