2016-11-15 1 views
0

내 Entity에는 @Id (수동으로 설정 한) 주석이 있고 id라는 필드가 있습니다. 알고 싶습니다. 고유 ID를 자동 생성 할 수 있습니까 (@ GeneratedValue) 그러나 나는 또한 ID를 수동으로 설정하고 싶지 않을 때 그것을 설정해야한다.JPA @GeneratedValue and @Id

예 : 나는 당신이 나를 이해 수 있기를 바랍니다 엔티티

new Entity(someid) //Once with ID and no generated value 
new Entity() //Second without ID and generated unique value 

@Id 
@GeneratedValue 
private long id; 

생성.

+1

"긴"필드를 '설정하지 않음'으로 설명하십시오. 그것이 긴 경우에 나는 아마 이해할 수 있었다, 그러나 길지 않았다. –

답변

2

글쎄 나는 이것이 효과가 있다고 생각하지 않는다. JPA는 자동으로 ID 값을 생성하며 @GeneratedValue을 담당합니다. id 100을 가진 기존 엔티티가 이미 존재한다면 어떻게되는지 스스로에게 물어보십시오. 그리고 수동으로 100 'ID를 가진 새로운 엔티티를 생성합니다. 직관적으로 나는 JPA (또는 구현)가 expection을 던진다 고 말할 것이다.

나는 전혀 시도하지 않은 자신의 발전기를 (작성의 아이디어를 가지고 위의 답을 쓰는 동안은, 단지 유래 여기 아래로 코딩.

당신은 @GeneratedValue 주석

에 발전기의 자신의 구현을 전달할 수 있습니다
@Id 
@GeneratedValue(startegy = GenerationType.IDENTITY, generator="generatedIdOrCustomId") 
@GenericGenerator(name="generatedIdOrCustomId", strategy="GeneratedIdOrCustomId") 
private Long id; 
... 

그리고 사용자 정의 구현은 다음과 같아야합니다

public class GeneratedIdOrCustomId extends IdentityGenerator { 

@Override 
public Serializable generate(SessionImplementor session, Object obj) throws HibernateException { 
    if (((YourEntity) obj).getId() == null) { 
     // the id is null, let JPA create an id. 
     return super.generate(session, obj); 
    } else { 
     // the id is set and should not be generated by JPA. 
     return ((YourEntity) obj).getId(); 
    } 
} 

하기는 M을 생성 ethod는 빠르고 지저분한 구현입니다. 이 경우에는 예를 들어 obj == null을 확인하고 (Hibernate)Exception을 던져야합니다.

+0

그래, 문제가 생길거야. 감사. –

관련 문제